Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,281 @@
using System;
using Server.Commands;
using Server.Mobiles;
namespace Server.Items
{
public class ArisenController : Item
{
private static readonly int SpawnHour = 0; // Midnight
private static readonly int DespawnHour = 4; // 4 AM
public class ArisenEntry
{
private Map m_Map;
private Point3D m_Location;
private string m_Creature;
private int m_Amount;
private int m_HomeRange;
private int m_SpawnRange;
private TimeSpan m_MinDelay;
private TimeSpan m_MaxDelay;
public Map Map { get { return m_Map; } }
public Point3D Location { get { return m_Location; } }
public string Creature { get { return m_Creature; } }
public int Amount { get { return m_Amount; } }
public int HomeRange { get { return m_HomeRange; } }
public int SpawnRange { get { return m_SpawnRange; } }
public TimeSpan MinDelay { get { return m_MinDelay; } }
public TimeSpan MaxDelay { get { return m_MaxDelay; } }
public ArisenEntry(Map map, Point3D location, string creature, int amount, int homeRange, int spawnRange, TimeSpan minDelay, TimeSpan maxDelay)
{
m_Map = map;
m_Location = location;
m_Creature = creature;
m_Amount = amount;
m_HomeRange = homeRange;
m_SpawnRange = spawnRange;
m_MinDelay = minDelay;
m_MaxDelay = maxDelay;
}
public XmlSpawner CreateSpawner()
{
XmlSpawner spawner = new XmlSpawner(m_Amount, (int)m_MinDelay.TotalSeconds, (int)m_MaxDelay.TotalSeconds, 0, 20, 10, m_Creature);
spawner.MoveToWorld(this.Location, this.Map);
return spawner;
}
}
private static ArisenEntry[] m_Entries = new ArisenEntry[]
{
new ArisenEntry( Map.TerMur, new Point3D( 996, 3862, -42 ), "EffeteUndeadGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 15.0 ), TimeSpan.FromSeconds( 30.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3863, -42 ), "EffetePutridGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 30.0 ), TimeSpan.FromSeconds( 60.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3864, -42 ), "GargoyleShade", 2, 15, 10, TimeSpan.FromSeconds( 60.0 ), TimeSpan.FromSeconds( 90.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3892, -42 ), "EffeteUndeadGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 15.0 ), TimeSpan.FromSeconds( 30.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3893, -42 ), "EffetePutridGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 30.0 ), TimeSpan.FromSeconds( 60.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3917, -42 ), "EffeteUndeadGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 15.0 ), TimeSpan.FromSeconds( 30.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3918, -42 ), "EffetePutridGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 30.0 ), TimeSpan.FromSeconds( 60.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3951, -42 ), "EffeteUndeadGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 15.0 ), TimeSpan.FromSeconds( 30.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 996, 3952, -42 ), "EffetePutridGargoyle", 5, 20, 15, TimeSpan.FromSeconds( 30.0 ), TimeSpan.FromSeconds( 60.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 997, 3951, -42 ), "GargoyleShade", 2, 15, 10, TimeSpan.FromSeconds( 60.0 ), TimeSpan.FromSeconds( 90.0 ) ),
new ArisenEntry( Map.TerMur, new Point3D( 997, 3951, -42 ), "PutridUndeadGargoyle", 1, 10, 5, TimeSpan.FromMinutes( 5.0 ), TimeSpan.FromMinutes( 10.0 ) )
};
public static ArisenEntry[] Entries { get { return m_Entries; } }
private static ArisenController m_Instance;
public static ArisenController Instance { get { return m_Instance; } }
public static void Initialize()
{
CommandSystem.Register("ArisenGenerate", AccessLevel.Owner, new CommandEventHandler(ArisenGenerate_OnCommand));
CommandSystem.Register("ArisenDelete", AccessLevel.Owner, new CommandEventHandler(ArisenDelete_OnCommand));
}
[Usage("ArisenGenerate")]
[Description("Generates the Arisen creatures spawner.")]
private static void ArisenGenerate_OnCommand(CommandEventArgs args)
{
Mobile from = args.Mobile;
if (Create())
from.SendMessage("Arisen creatures spawner generated.");
else
from.SendMessage("Arisen creatures spawner already present.");
}
[Usage("ArisenDelete")]
[Description("Removes the Arisen creatures spawner.")]
private static void ArisenDelete_OnCommand(CommandEventArgs args)
{
Mobile from = args.Mobile;
if (Remove())
from.SendMessage("Arisen creatures spawner removed.");
else
from.SendMessage("Arisen creatures spawner not present.");
}
public static bool Create()
{
if (m_Instance != null && !m_Instance.Deleted)
return false;
m_Instance = new ArisenController();
WeakEntityCollection.Add("sa", m_Instance);
return true;
}
public static bool Remove()
{
if (m_Instance == null)
return false;
m_Instance.Delete();
m_Instance = null;
return true;
}
private InternalTimer m_SpawnTimer;
private XmlSpawner[] m_Spawners;
private bool m_Spawned;
private bool m_ForceDeactivate;
[CommandProperty(AccessLevel.Seer)]
public bool ForceDeactivate
{
get { return m_ForceDeactivate; }
set { m_ForceDeactivate = value; }
}
private ArisenController()
: base(1)
{
Name = "Arisen Controller - Internal";
Movable = false;
m_Spawners = new XmlSpawner[m_Entries.Length];
for (int i = 0; i < m_Entries.Length; i++)
{
m_Spawners[i] = m_Entries[i].CreateSpawner();
m_Spawners[i].SmartSpawning = true;
}
m_SpawnTimer = new InternalTimer(this);
m_SpawnTimer.Start();
}
public override void OnDelete()
{
base.OnDelete();
if (m_SpawnTimer != null)
{
m_SpawnTimer.Stop();
m_SpawnTimer = null;
}
foreach (XmlSpawner spawner in m_Spawners)
spawner.Delete();
m_Instance = null;
}
public void OnTick()
{
// check time
int hours, minutes;
Clock.GetTime(Map.TerMur, 997, 3869, out hours, out minutes); // Holy City
m_Spawned = (hours >= SpawnHour && hours < DespawnHour) && !m_ForceDeactivate;
foreach (XmlSpawner spawner in m_Spawners)
{
if (!m_Spawned)
{
spawner.Reset();
}
else
{
if (!spawner.Running)
{
spawner.Respawn();
}
}
}
}
public class InternalTimer : Timer
{
private ArisenController m_Controller;
public InternalTimer(ArisenController controller)
: base(TimeSpan.Zero, TimeSpan.FromSeconds(5.0))
{
m_Controller = controller;
}
protected override void OnTick()
{
m_Controller.OnTick();
}
}
public ArisenController(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(1); // version
// Version 1
writer.Write((bool)m_ForceDeactivate);
// Version 0
writer.WriteEncodedInt(m_Spawners.Length);
for (int i = 0; i < m_Spawners.Length; i++)
writer.WriteItem<XmlSpawner>(m_Spawners[i]);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
switch (version)
{
case 1:
{
m_ForceDeactivate = reader.ReadBool();
goto case 0;
}
case 0:
{
int length = reader.ReadEncodedInt();
m_Spawners = new XmlSpawner[length];
for (int i = 0; i < length; i++)
{
var spawner = reader.ReadItem<XmlSpawner>();
if (spawner == null)
{
spawner = m_Entries[i].CreateSpawner();
spawner.SmartSpawning = true;
}
m_Spawners[i] = spawner;
}
break;
}
}
m_Instance = this;
m_SpawnTimer = new InternalTimer(this);
m_SpawnTimer.Start();
}
}
}

View File

@@ -0,0 +1,126 @@
using Server;
using System;
using System.Collections.Generic;
namespace Server.Engines.TombOfKings
{
public class ChamberInfo
{
private Point3D m_BarrierLocation, m_SwitchLocation;
private int m_SwitchId;
public Point3D BarrierLocation { get { return m_BarrierLocation; } }
public Point3D SwitchLocation { get { return m_SwitchLocation; } }
public int SwitchId { get { return m_SwitchId; } }
public ChamberInfo( Point3D barrierLoc, Point3D switchLoc, int switchId )
{
m_BarrierLocation = barrierLoc;
m_SwitchLocation = switchLoc;
m_SwitchId = switchId;
}
}
public class Chamber
{
public static void Initialize()
{
// we should call it after deserialize the levers
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( Generate ) );
}
public static void Generate()
{
if ( ChamberLever.Levers.Count == 0 )
return;
foreach ( ChamberInfo info in m_ChamberInfos )
m_Chambers.Add( new Chamber( info ) );
// randomize
List<ChamberLever> levers = new List<ChamberLever>( ChamberLever.Levers );
foreach ( Chamber chamber in m_Chambers )
{
int idx = Utility.Random( levers.Count );
chamber.Lever = levers[idx];
levers[idx].Chamber = chamber;
levers.RemoveAt( idx );
}
}
private static List<Chamber> m_Chambers = new List<Chamber>();
public static List<Chamber> Chambers
{
get { return m_Chambers; }
}
private static ChamberInfo[] m_ChamberInfos = new ChamberInfo[]
{
// left side
new ChamberInfo( new Point3D( 15, 200, -5 ), new Point3D( 13, 195, 7 ), 0x1091 ),
new ChamberInfo( new Point3D( 15, 184, -5 ), new Point3D( 13, 179, 7 ), 0x1091 ),
new ChamberInfo( new Point3D( 15, 168, -5 ), new Point3D( 13, 163, 7 ), 0x1091 ),
new ChamberInfo( new Point3D( 15, 152, -5 ), new Point3D( 13, 147, 7 ), 0x1091 ),
new ChamberInfo( new Point3D( 15, 136, -5 ), new Point3D( 13, 131, 7 ), 0x1091 ),
new ChamberInfo( new Point3D( 15, 120, -5 ), new Point3D( 13, 115, 7 ), 0x1091 ),
// right side
new ChamberInfo( new Point3D( 55, 200, -5 ), new Point3D( 56, 197, 7 ), 0x1090 ),
new ChamberInfo( new Point3D( 55, 184, -5 ), new Point3D( 56, 181, 7 ), 0x1090 ),
new ChamberInfo( new Point3D( 55, 168, -5 ), new Point3D( 56, 165, 7 ), 0x1090 ),
new ChamberInfo( new Point3D( 55, 152, -5 ), new Point3D( 56, 149, 7 ), 0x1090 ),
new ChamberInfo( new Point3D( 55, 136, -5 ), new Point3D( 56, 133, 7 ), 0x1090 ),
new ChamberInfo( new Point3D( 55, 120, -5 ), new Point3D( 56, 117, 7 ), 0x1090 ),
};
private ChamberSwitch m_Switch;
private ChamberBarrier m_Barrier;
private ChamberLever m_Lever;
public ChamberSwitch Switch
{
get { return m_Switch; }
set { m_Switch = value; }
}
public ChamberBarrier Barrier
{
get { return m_Barrier; }
set { m_Barrier = value; }
}
public ChamberLever Lever
{
get { return m_Lever; }
set { m_Lever = value; }
}
public bool IsOpened()
{
return !m_Barrier.Active;
}
public void Open()
{
m_Barrier.Active = false;
m_Lever.Switch();
Timer.DelayCall( TimeSpan.FromMinutes( Utility.RandomMinMax( 10, 15 ) ), RestoreBarrier );
}
public void RestoreBarrier()
{
m_Barrier.Active = true;
m_Lever.InvalidateProperties();
}
public Chamber( ChamberInfo info )
{
m_Switch = new ChamberSwitch( this, info.SwitchLocation, info.SwitchId );
m_Barrier = new ChamberBarrier( info.BarrierLocation );
}
}
}

View File

@@ -0,0 +1,103 @@
using System;
using Server;
using Server.Items;
namespace Server.Engines.TombOfKings
{
public class ChamberBarrier : Item
{
private Blocker m_Blocker;
private LOSBlocker m_LOSBlocker;
public bool Active
{
get { return Visible; }
set
{
if (Visible != value)
{
if (Visible = value)
{
m_Blocker = new Blocker();
m_Blocker.MoveToWorld(Location, Map);
m_LOSBlocker = new LOSBlocker();
m_LOSBlocker.MoveToWorld(Location, Map);
}
else
{
m_Blocker.Delete();
m_Blocker = null;
m_LOSBlocker.Delete();
m_LOSBlocker = null;
}
}
}
}
public ChamberBarrier(Point3D loc)
: base(0x3979)
{
Light = LightType.Circle150;
Movable = false;
MoveToWorld(loc, Map.TerMur);
m_Blocker = new Blocker();
m_Blocker.MoveToWorld(loc, Map.TerMur);
m_LOSBlocker = new LOSBlocker();
m_LOSBlocker.MoveToWorld(loc, Map.TerMur);
}
public ChamberBarrier(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((bool)(m_Blocker != null));
if (m_Blocker != null)
writer.Write((Item)m_Blocker);
writer.Write((bool)(m_LOSBlocker != null));
if (m_LOSBlocker != null)
writer.Write((Item)m_LOSBlocker);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (reader.ReadBool())
{
m_Blocker = reader.ReadItem() as Blocker;
if (m_Blocker != null)
{
m_Blocker.Delete();
}
}
if (reader.ReadBool())
{
m_LOSBlocker = reader.ReadItem() as LOSBlocker;
if (m_LOSBlocker != null)
{
m_LOSBlocker.Delete();
}
}
Delete();
}
}
}

View File

@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using Server;
namespace Server.Engines.TombOfKings
{
public class ChamberLever : Item
{
public static void Generate()
{
foreach (Point3D loc in m_LeverLocations)
{
var item = new ChamberLever(loc);
WeakEntityCollection.Add("sa", item);
m_Levers.Add(item);
}
}
private static Point3D[] m_LeverLocations = new Point3D[]
{
new Point3D( 25, 229, 2 ),
new Point3D( 25, 227, 2 ),
new Point3D( 25, 225, 2 ),
new Point3D( 25, 221, 2 ),
new Point3D( 25, 219, 2 ),
new Point3D( 25, 217, 2 ),
new Point3D( 45, 229, 2 ),
new Point3D( 45, 227, 2 ),
new Point3D( 45, 225, 2 ),
new Point3D( 45, 221, 2 ),
new Point3D( 45, 219, 2 ),
new Point3D( 45, 217, 2 ),
};
private static List<ChamberLever> m_Levers = new List<ChamberLever>();
public static List<ChamberLever> Levers
{
get { return m_Levers; }
}
private Chamber m_Chamber;
public Chamber Chamber
{
get { return m_Chamber; }
set
{
m_Chamber = value;
InvalidateProperties();
}
}
public bool IsUsable()
{
if (m_Chamber == null)
return false;
return !m_Chamber.IsOpened();
}
public ChamberLever(Point3D loc)
: base(Utility.RandomBool() ? 0x108C : 0x108E)
{
Movable = false;
MoveToWorld(loc, Map.TerMur);
}
public ChamberLever(Serial serial)
: base(serial)
{
}
public override void AddNameProperties(ObjectPropertyList list)
{
if (IsUsable())
list.Add(1112130); // a lever
else
list.Add(1112129); // a lever (unusable)
}
public override void OnDoubleClick(Mobile from)
{
if (IsUsable() && from.InRange(this, 1))
m_Chamber.Open();
}
public void Switch()
{
if (ItemID == 0x108C)
ItemID = 0x108E;
else
ItemID = 0x108C;
Effects.PlaySound(Location, Map, 0x3E8);
InvalidateProperties();
}
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();
m_Levers.Add(this);
}
}
}

View File

@@ -0,0 +1,149 @@
using System;
using System.Collections.Generic;
using Server.Mobiles;
namespace Server.Engines.TombOfKings
{
public class ChamberSpawner : Item
{
public static void Generate()
{
for (int i = 0; i < m_Positions.Length; i++)
{
WeakEntityCollection.Add("sa", new ChamberSpawner(m_Positions[i], Map.TerMur));
}
}
private static Point3D[] m_Positions = new Point3D[]
{
new Point3D( 9, 199, -9 ),
new Point3D( 9, 183, -9 ),
new Point3D( 9, 167, -9 ),
new Point3D( 9, 151, -9 ),
new Point3D( 9, 135, -9 ),
new Point3D( 9, 119, -9 ),
new Point3D( 60, 199, -9 ),
new Point3D( 60, 183, -9 ),
new Point3D( 60, 167, -9 ),
new Point3D( 60, 151, -9 ),
new Point3D( 60, 135, -9 ),
new Point3D( 60, 119, -9 ),
};
private static Type[] m_CreatureTypes = new Type[]
{
typeof( SilverSerpent ),
typeof( UndeadGuardian ),
typeof( PutridUndeadGuardian )
};
private List<Mobile> m_Creatures;
private Timer m_RespawnTimer;
public ChamberSpawner(Point3D loc, Map map)
: base(0x2006)
{
Stackable = true;
Amount = loc.Y <= 152 ? 754 : 753;
Movable = false;
m_Creatures = new List<Mobile>();
MoveToWorld(loc, map);
Respawn();
m_RespawnTimer = Timer.DelayCall(TimeSpan.FromMinutes(15.0), TimeSpan.FromMinutes(15.0), new TimerCallback(CheckSpawn));
}
public override void AddNameProperties(ObjectPropertyList list)
{
list.Add(1070701, "gargoyle"); // a ~1_CORPSENAME~ corpse
}
public bool IsEmpty()
{
for (int i = 0; i < m_Creatures.Count; i++)
if (m_Creatures[i].Alive)
return false;
return true;
}
public void CheckSpawn()
{
if (Utility.RandomBool() && IsEmpty())
Respawn();
}
public void Respawn()
{
m_Creatures.Clear();
int total = Utility.RandomMinMax(3, 8);
Type creatureType = m_CreatureTypes[Utility.Random(m_CreatureTypes.Length)];
for (int i = 0; i < total; i++)
{
Mobile m = (Mobile)Activator.CreateInstance(creatureType);
m.MoveToWorld(Map.GetSpawnPosition(Location, 4), Map);
BaseCreature bc = m as BaseCreature;
if (bc != null)
{
bc.RangeHome = 5;
bc.Home = Location;
}
m_Creatures.Add(m);
}
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
for (int i = 0; i < m_Creatures.Count; i++)
m_Creatures[i].Delete();
if (m_RespawnTimer != null)
m_RespawnTimer.Stop();
}
public ChamberSpawner(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)m_Creatures.Count);
for (int i = 0; i < m_Creatures.Count; i++)
writer.Write((Mobile)m_Creatures[i]);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_Creatures = new List<Mobile>();
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
Mobile m = reader.ReadMobile();
if (m != null)
m_Creatures.Add(m);
}
m_RespawnTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromMinutes(15.0), new TimerCallback(CheckSpawn));
}
}
}

View File

@@ -0,0 +1,56 @@
using System;
using Server;
namespace Server.Engines.TombOfKings
{
public class ChamberSwitch : Item
{
private Chamber m_Chamber;
public ChamberSwitch(Chamber chamber, Point3D loc, int itemId)
: base(itemId)
{
m_Chamber = chamber;
Movable = false;
MoveToWorld(loc, Map.TerMur);
}
public override void OnDoubleClick(Mobile from)
{
if (!m_Chamber.IsOpened() && from.InRange(this, 1))
{
Effects.PlaySound(Location, Map, 0x3E8);
switch (ItemID)
{
case 0x108F: ItemID = 0x1090; break;
case 0x1090: ItemID = 0x108F; break;
case 0x1091: ItemID = 0x1092; break;
case 0x1092: ItemID = 0x1091; break;
}
m_Chamber.Open();
}
}
public ChamberSwitch(Serial serial)
: base(serial)
{
}
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();
Delete();
}
}
}

View File

@@ -0,0 +1,169 @@
using System;
using Server.Items;
using Server.Commands;
using Server.Mobiles;
namespace Server.Engines.TombOfKings
{
public class Generator
{
public static void Initialize()
{
CommandSystem.Register("GenToK", AccessLevel.Developer, new CommandEventHandler(GenToK_Command));
}
[Usage("GenToK")]
private static void GenToK_Command(CommandEventArgs e)
{
e.Mobile.SendMessage("Creating Tomb of Kings...");
// Bridge
Static st = new Static(16880);
WeakEntityCollection.Add("sa", st);
st.MoveToWorld(new Point3D(36, 36, 0), Map.TerMur);
st = new Static(16882);
WeakEntityCollection.Add("sa", st);
st.MoveToWorld(new Point3D(37, 36, 0), Map.TerMur);
st = new Static(16883);
st.MoveToWorld(new Point3D(38, 36, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16878);
st.MoveToWorld(new Point3D(36, 35, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(37, 35, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(38, 35, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16878);
st.MoveToWorld(new Point3D(36, 34, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(37, 34, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(38, 34, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16878);
st.MoveToWorld(new Point3D(36, 33, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(37, 33, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(38, 33, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16878);
st.MoveToWorld(new Point3D(36, 32, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(37, 32, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16884);
st.MoveToWorld(new Point3D(38, 32, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16872);
st.MoveToWorld(new Point3D(36, 31, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16873);
st.MoveToWorld(new Point3D(37, 31, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(16874);
st.MoveToWorld(new Point3D(38, 31, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
//Sacred Quest Blocker
SacredQuestBlocker sq = new SacredQuestBlocker();
sq.MoveToWorld(new Point3D(35, 38, 0), Map.TerMur);
WeakEntityCollection.Add("sa", sq);
sq = new SacredQuestBlocker();
sq.MoveToWorld(new Point3D(36, 38, 0), Map.TerMur);
WeakEntityCollection.Add("sa", sq);
sq = new SacredQuestBlocker();
sq.MoveToWorld(new Point3D(37, 38, 0), Map.TerMur);
WeakEntityCollection.Add("sa", sq);
sq = new SacredQuestBlocker();
sq.MoveToWorld(new Point3D(38, 38, 0), Map.TerMur);
WeakEntityCollection.Add("sa", sq);
sq = new SacredQuestBlocker();
sq.MoveToWorld(new Point3D(39, 38, 0), Map.TerMur);
WeakEntityCollection.Add("sa", sq);
// Guardian
XmlSpawner spawner = new XmlSpawner(1, 300, 600, 0, 0, 0, "GargoyleDestroyer, /blessed/true/Frozen/true/Direction/West/Paralyzed/true/Hue/2401/Name/Guardian");
spawner.SmartSpawning = true;
spawner.MoveToWorld(new Point3D(42, 38, 13), Map.TerMur);
WeakEntityCollection.Add("sa", spawner);
spawner = new XmlSpawner(1, 300, 600, 0, 0, 0, "GargoyleDestroyer, /blessed/true/Frozen/true/Direction/East/Paralyzed/true/Hue/2401/Name/Guardian");
spawner.SmartSpawning = true;
spawner.MoveToWorld(new Point3D(33, 38, 13), Map.TerMur);
WeakEntityCollection.Add("sa", spawner);
// Teleporter
ToKTeleporter t = new ToKTeleporter();
t.MoveToWorld(new Point3D(21, 99, 1), Map.TerMur);
WeakEntityCollection.Add("sa", t);
st = new Static(14186); // sparkle
st.MoveToWorld(new Point3D(21, 99, 1), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(18304); // door
st.MoveToWorld(new Point3D(18, 99, 0), Map.TerMur);
WeakEntityCollection.Add("sa", st);
TombOfKingsSecretDoor door = new TombOfKingsSecretDoor(18304);
door.MoveToWorld(new Point3D(52, 99, 0), Map.TerMur);
WeakEntityCollection.Add("sa", door);
// Serpent's Breath
Item flame = new FlameOfOrder(new Point3D(28, 212, 3), Map.TerMur);
WeakEntityCollection.Add("sa", flame);
flame = new FlameOfChaos(new Point3D(43, 212, 3), Map.TerMur);
WeakEntityCollection.Add("sa", flame);
st = new Static(3025);
st.Name = "Order Shall Steal The Serpent's Strength";
st.MoveToWorld(new Point3D(28, 208, 4), Map.TerMur);
WeakEntityCollection.Add("sa", st);
st = new Static(3025);
st.Name = "Chaos Shall Quell The Serpent's Wrath";
st.MoveToWorld(new Point3D(28, 208, 4), Map.TerMur);
WeakEntityCollection.Add("sa", st);
// Kings' Chambers
ChamberLever.Generate();
Chamber.Generate();
ChamberSpawner.Generate();
CommandSystem.Handle(e.Mobile, Server.Commands.CommandSystem.Prefix + "ArisenGenerate");
e.Mobile.SendMessage("Generation completed!");
}
}
}

View File

@@ -0,0 +1,60 @@
using System;
using Server;
using Server.Mobiles;
namespace Server.Items
{
public class SacredQuestBlocker : Item
{
[Constructable]
public SacredQuestBlocker()
: base(0x1BC3)
{
Name = "Sacred Quest Blocker";
Movable = false;
Visible = false;
}
public SacredQuestBlocker(Serial serial)
: base(serial)
{
}
public override bool OnMoveOver(Mobile m)
{
if (!base.OnMoveOver(m))
return false;
PlayerMobile pm = m as PlayerMobile;
if (m is BaseCreature)
pm = ((BaseCreature)m).ControlMaster as PlayerMobile;
if (pm != null && pm.AbyssEntry)
{
m.SendLocalizedMessage(1112227); // May the Virtues guide thine quest.
return true;
}
else
{
m.SendLocalizedMessage(1112226); // Thou must be on a Sacred Quest to pass through.
return false;
}
}
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();
}
}
}

View File

@@ -0,0 +1,75 @@
using System;
namespace Server.Items
{
public class EnergyBarrier : Item
{
private Timer m_SoundTimer;
[CommandProperty(AccessLevel.GameMaster)]
public bool Active
{
get { return Visible; }
set
{
if (Active != value)
{
Visible = value;
if (Active)
m_SoundTimer.Start();
else
m_SoundTimer.Stop();
}
}
}
public EnergyBarrier(Point3D location, Map map)
: base(0x3967)
{
Movable = false;
Light = LightType.Circle150;
MoveToWorld(location, map);
m_SoundTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(Utility.RandomMinMax(5, 50)), new TimerCallback(PlaySound));
m_SoundTimer.Start();
}
protected void PlaySound()
{
// Randomize the Timer Interval
m_SoundTimer.Interval = TimeSpan.FromSeconds(Utility.RandomMinMax(5, 50));
Effects.PlaySound(Location, Map, Utility.RandomList(0x1DC, 0x210, 0x2F4));
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
if (m_SoundTimer != null)
m_SoundTimer.Stop();
}
public EnergyBarrier(Serial serial)
: base(serial)
{
}
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();
m_SoundTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(5.0), new TimerCallback(PlaySound));
m_SoundTimer.Start();
}
}
}

View File

@@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
namespace Server.Items
{
public class FireBarrier : Item
{
private Timer m_SoundTimer;
[CommandProperty(AccessLevel.GameMaster)]
public bool Active
{
get { return Visible; }
set
{
if (Active != value)
{
Visible = value;
if (Active)
m_SoundTimer.Start();
else
m_SoundTimer.Stop();
}
}
}
public FireBarrier(Point3D location, Map map)
: base(0x3E27)
{
Movable = false;
Light = LightType.Circle150;
Hue = 0x47E;
MoveToWorld(location, map);
m_SoundTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(Utility.RandomMinMax(5, 50)), new TimerCallback(PlaySound));
m_SoundTimer.Start();
}
protected void PlaySound()
{
// Randomize the Timer Interval
m_SoundTimer.Interval = TimeSpan.FromSeconds(Utility.RandomMinMax(5, 50));
//Effects.PlaySound( Location, Map, Utility.RandomList( 0x1DC, 0x210, 0x2F4 ) );
Effects.PlaySound(Location, Map, Utility.RandomList(0x1DD, 0x345, 0x346, 0x347, 0x348, 0x349, 0x34A));
}
private Dictionary<Mobile, Timer> m_DamageTable = new Dictionary<Mobile, Timer>();
public override bool HandlesOnMovement { get { return true; } }
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (!Active || !m.Alive || !m.IsPlayer())
return;
if (m.InRange(this, 1) && !m_DamageTable.ContainsKey(m))
{
// Should start the timer
m_DamageTable[m] = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(5.0), new TimerStateCallback<Mobile>(Damage), m);
}
}
protected void Damage(Mobile m)
{
if (Active && m.IsPlayer() && m.Alive && !Deleted && m.InRange(this, 1))
{
AOS.Damage(m, Utility.RandomMinMax(5, 7), 0, 100, 0, 0, 0);
}
else
{
Timer t = m_DamageTable[m];
t.Stop();
m_DamageTable.Remove(m);
}
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
if (m_SoundTimer != null)
m_SoundTimer.Stop();
}
public FireBarrier(Serial serial)
: base(serial)
{
}
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();
m_SoundTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(5.0), new TimerCallback(PlaySound));
m_SoundTimer.Start();
}
}
}

View File

@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
namespace Server.Items
{
public class FlameOfChaos : Item
{
public override int LabelNumber { get { return 1112128; } } // Flame of Chaos
private List<FireBarrier> m_Barriers;
[Constructable]
public FlameOfChaos(Point3D location, Map map)
: base(0x19AB)
{
Movable = false;
Light = LightType.Circle225;
MoveToWorld(location, map);
m_Barriers = new List<FireBarrier>(m_BarrierLocations.Length);
for (int i = 0; i < m_BarrierLocations.Length; i++)
{
m_Barriers.Add(new FireBarrier(m_BarrierLocations[i], map));
}
}
public override bool HandlesOnSpeech { get { return true; } }
public override void OnSpeech(SpeechEventArgs e)
{
string mantra = e.Speech.ToLower();
if (Visible && e.Mobile.InRange(this, 2) && (mantra == "an-ord" || mantra == "anord"))
{
Visible = false;
foreach (FireBarrier barrier in m_Barriers)
{
barrier.Active = false;
}
Timer.DelayCall(TimeSpan.FromMinutes(2.0), new TimerCallback(RestoreBarrier));
}
}
protected void RestoreBarrier()
{
foreach (FireBarrier barrier in m_Barriers)
{
barrier.Active = true;
}
Visible = true;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
foreach (FireBarrier barrier in m_Barriers)
{
barrier.Delete();
}
}
private static Point3D[] m_BarrierLocations = new Point3D[]
{
new Point3D( 33, 207, 0 ),
new Point3D( 34, 207, 0 ),
new Point3D( 35, 207, 0 ),
new Point3D( 36, 207, 0 ),
new Point3D( 37, 207, 0 ),
new Point3D( 33, 206, 0 ),
new Point3D( 34, 206, 0 ),
new Point3D( 35, 206, 0 ),
new Point3D( 36, 206, 0 ),
new Point3D( 37, 206, 0 ),
new Point3D( 33, 204, 0 ),
new Point3D( 34, 204, 0 ),
new Point3D( 35, 204, 0 ),
new Point3D( 36, 204, 0 ),
new Point3D( 37, 204, 0 ),
new Point3D( 33, 203, 0 ),
new Point3D( 34, 203, 0 ),
new Point3D( 35, 203, 0 ),
new Point3D( 36, 203, 0 ),
new Point3D( 37, 203, 0 )
};
public FlameOfChaos(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)m_Barriers.Count);
for (int i = 0; i < m_Barriers.Count; i++)
writer.Write((Item)m_Barriers[i]);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
int amount = reader.ReadInt();
m_Barriers = new List<FireBarrier>(amount);
for (int i = 0; i < amount; i++)
m_Barriers.Add(reader.ReadItem() as FireBarrier);
if (!Visible)
Timer.DelayCall(TimeSpan.Zero, new TimerCallback(RestoreBarrier));
}
}
}

View File

@@ -0,0 +1,209 @@
using System;
using System.Collections.Generic;
namespace Server.Items
{
public class FlameOfOrder : Item
{
public override int LabelNumber { get { return 1112127; } } // Flame of Order
private List<EnergyBarrier> m_Barriers;
private List<Blocker> m_Blockers;
private List<LOSBlocker> m_LOSBlockers;
private List<SBMessageTrigger> m_MsgTriggers;
[Constructable]
public FlameOfOrder(Point3D location, Map map)
: base(0x19AB)
{
Movable = false;
Light = LightType.Circle225;
MoveToWorld(location, map);
m_Barriers = new List<EnergyBarrier>(m_BarrierLocations.Length);
m_Blockers = new List<Blocker>(m_BarrierLocations.Length);
m_LOSBlockers = new List<LOSBlocker>(m_BarrierLocations.Length);
m_MsgTriggers = new List<SBMessageTrigger>(m_MsgTriggerLocations.Length);
foreach (Point3D loc in m_BarrierLocations)
{
m_Barriers.Add(new EnergyBarrier(loc, map));
Blocker blocker = new Blocker();
blocker.MoveToWorld(loc, map);
m_Blockers.Add(blocker);
LOSBlocker losblocker = new LOSBlocker();
losblocker.MoveToWorld(loc, map);
m_LOSBlockers.Add(losblocker);
}
foreach (Point3D loc in m_MsgTriggerLocations)
{
SBMessageTrigger trigger = new SBMessageTrigger(this);
trigger.MoveToWorld(loc, map);
m_MsgTriggers.Add(trigger);
}
}
public override bool HandlesOnSpeech { get { return true; } }
public override void OnSpeech(SpeechEventArgs e)
{
string mantra = e.Speech.ToLower();
if (Visible && e.Mobile.InRange(this, 2) && mantra == "ord")
{
Visible = false;
foreach (EnergyBarrier barrier in m_Barriers)
barrier.Active = false;
foreach (Blocker blocker in m_Blockers)
blocker.Delete();
foreach (LOSBlocker losblocker in m_LOSBlockers)
losblocker.Delete();
m_Blockers.Clear();
m_LOSBlockers.Clear();
Timer.DelayCall(TimeSpan.FromMinutes(2.0), new TimerCallback(RestoreBarrier));
}
}
protected void RestoreBarrier()
{
foreach (EnergyBarrier barrier in m_Barriers)
barrier.Active = true;
foreach (Point3D loc in m_BarrierLocations)
{
Blocker blocker = new Blocker();
blocker.MoveToWorld(loc, Map);
m_Blockers.Add(blocker);
LOSBlocker losblocker = new LOSBlocker();
losblocker.MoveToWorld(loc, Map);
m_LOSBlockers.Add(losblocker);
}
Visible = true;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
foreach (Blocker blocker in m_Blockers)
{
blocker.Delete();
}
foreach (LOSBlocker losblocker in m_LOSBlockers)
{
losblocker.Delete();
}
foreach (SBMessageTrigger trigger in m_MsgTriggers)
{
trigger.Delete();
}
foreach (EnergyBarrier barrier in m_Barriers)
{
barrier.Delete();
}
}
private static Point3D[] m_BarrierLocations = new Point3D[]
{
new Point3D( 33, 205, 0 ),
new Point3D( 34, 205, 0 ),
new Point3D( 35, 205, 0 ),
new Point3D( 36, 205, 0 ),
new Point3D( 37, 205, 0 ),
};
private static Point3D[] m_MsgTriggerLocations = new Point3D[]
{
new Point3D( 33, 203, 0 ),
new Point3D( 34, 203, 0 ),
new Point3D( 35, 203, 0 ),
new Point3D( 36, 203, 0 ),
new Point3D( 37, 203, 0 ),
};
public FlameOfOrder(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)m_Barriers.Count);
for (int i = 0; i < m_Barriers.Count; i++)
writer.Write((Item)m_Barriers[i]);
writer.Write((int)m_Blockers.Count);
for (int i = 0; i < m_Blockers.Count; i++)
writer.Write((Item)m_Blockers[i]);
writer.Write((int)m_LOSBlockers.Count);
for (int i = 0; i < m_LOSBlockers.Count; i++)
writer.Write((Item)m_LOSBlockers[i]);
writer.Write((int)m_MsgTriggers.Count);
for (int i = 0; i < m_MsgTriggers.Count; i++)
writer.Write((Item)m_MsgTriggers[i]);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
// barrier
int amount = reader.ReadInt();
m_Barriers = new List<EnergyBarrier>(amount);
for (int i = 0; i < amount; i++)
m_Barriers.Add(reader.ReadItem() as EnergyBarrier);
// blockers
amount = reader.ReadInt();
m_Blockers = new List<Blocker>(amount);
for (int i = 0; i < amount; i++)
m_Blockers.Add(reader.ReadItem() as Blocker);
amount = reader.ReadInt();
m_LOSBlockers = new List<LOSBlocker>(amount);
for (int i = 0; i < amount; i++)
m_LOSBlockers.Add(reader.ReadItem() as LOSBlocker);
// msg triggers
amount = reader.ReadInt();
m_MsgTriggers = new List<SBMessageTrigger>(amount);
for (int i = 0; i < amount; i++)
m_MsgTriggers.Add(reader.ReadItem() as SBMessageTrigger);
if (!Visible)
Timer.DelayCall(TimeSpan.Zero, new TimerCallback(RestoreBarrier));
}
}
}

View File

@@ -0,0 +1,53 @@
using System;
using Server;
namespace Server.Items
{
public class SBMessageTrigger : Item
{
private FlameOfOrder m_Flame;
[Constructable]
public SBMessageTrigger(FlameOfOrder flame)
: base(0x1BC3)
{
m_Flame = flame;
Name = "Serpent's Breath Message Trigger";
Movable = false;
Visible = false;
}
public SBMessageTrigger(Serial serial)
: base(serial)
{
}
public override bool OnMoveOver(Mobile m)
{
if (m.Location.Y < Location.Y && !m_Flame.Deleted && m_Flame.Visible)
{
m.SendLocalizedMessage(1112225); // The Serpent's Breath burns brighter than ever, blocking your escape! You shall have to venture further into the tomb in search of an exit.
}
return base.OnMoveOver(m);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((Item)m_Flame);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_Flame = reader.ReadItem() as FlameOfOrder;
}
}
}

View File

@@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Xml;
using Server.Items;
namespace Server.Regions
{
public class ToKBridgeRegion : BaseRegion
{
public ToKBridgeRegion(XmlElement xml, Map map, Region parent)
: base(xml, map, parent)
{
Timer.DelayCall(TimeSpan.Zero, new TimerCallback(Ensure));
}
private List<Item> m_Blocks;
private Timer m_FadingTimer;
private int m_HuePointer;
public void Ensure()
{
m_Blocks = new List<Item>();
foreach (Rectangle3D r3d in Area)
{
Rectangle2D r2d = new Rectangle2D(r3d.Start, r3d.End);
foreach (Item item in Map.GetItemsInBounds(r2d))
{
if (item is Static)
m_Blocks.Add(item);
}
}
if (m_Blocks.Count == 0)
{
m_Blocks = null;
return;
}
foreach (Item item in m_Blocks)
{
item.Hue = 0x807;
item.Visible = false;
}
m_FadingTimer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(0.33), new TimerCallback(OnTick));
}
private static int[] m_Hues = new int[]
{
0,
0x807, 0x806, 0x805, 0x804, 0x803,
0x7E3, 0x7E4, 0x7E5, 0x7E6, 0x7E7,
0x7E8, 0x7E9, 0x3E3, 0x3E4, 0x380,
0
};
public void WakeUp()
{
if (m_Blocks == null)
Ensure();
if (m_FadingTimer != null && !m_FadingTimer.Running)
m_FadingTimer.Start();
}
public void OnTick()
{
m_HuePointer += GetPlayerCount() > 0 ? 1 : -1;
Utility.FixMinMax(ref m_HuePointer, 0, m_Hues.Length - 1);
foreach (Item item in m_Blocks)
item.Hue = m_Hues[m_HuePointer];
if (m_HuePointer == 0)
{
foreach (Item item in m_Blocks)
item.Visible = false;
m_FadingTimer.Stop();
}
else if (m_HuePointer == 1)
{
foreach (Item item in m_Blocks)
item.Visible = true;
}
else if (m_HuePointer == m_Hues.Length - 1)
{
m_FadingTimer.Stop();
}
}
public override void OnEnter(Mobile m)
{
WakeUp();
}
public override void OnExit(Mobile m)
{
WakeUp();
}
}
}

View File

@@ -0,0 +1,56 @@
using System;
using Server;
using Server.Mobiles;
namespace Server.Items
{
public class ToKTeleporter : Item
{
private static readonly Point3D m_Dest = new Point3D(35, 215, -5);
[Constructable]
public ToKTeleporter()
: base(0x1BC3)
{
Name = "Tomb of Kings Antechamber Teleporter";
Visible = false;
Movable = false;
}
public ToKTeleporter(Serial serial)
: base(serial)
{
}
public override bool OnMoveOver(Mobile m)
{
if (m.IsPlayer())
{
BaseCreature.TeleportPets(m, m_Dest, Map.TerMur);
m.MoveToWorld(m_Dest, Map.TerMur);
m.PlaySound(0x1FE);
Effects.SendLocationParticles(m, 0x3728, 10, 10, 0x139F);
m.SendLocalizedMessage(1112182); // You have been returned to the antechamber of the tomb, directly in front of the Serpent's Breath.
return false;
}
return base.OnMoveOver(m);
}
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();
}
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Xml;
namespace Server.Regions
{
public class TombOfKingsRegion : BaseRegion
{
public TombOfKingsRegion(XmlElement xml, Map map, Region parent)
: base(xml, map, parent)
{
}
public override void AlterLightLevel(Mobile m, ref int global, ref int personal)
{
global = 0;
}
}
}

View File

@@ -0,0 +1,79 @@
using System;
using Server;
namespace Server.Items
{
public class TombOfKingsSecretDoor : Item
{
public override int LabelNumber { get { return 1020233; } } // secret door
private int m_ClosedId;
[CommandProperty(AccessLevel.GameMaster)]
public int ClosedId
{
get { return m_ClosedId; }
set { m_ClosedId = value; }
}
[Constructable]
public TombOfKingsSecretDoor(int closedId)
: base(closedId)
{
Movable = false;
m_ClosedId = closedId;
}
public override void OnDoubleClickDead(Mobile from)
{
Open(from);
}
public override void OnDoubleClick(Mobile from)
{
Open(from);
}
public void Open(Mobile from)
{
if (!from.InRange(this, 1))
return;
if (ItemID == ClosedId)
{
ItemID = 1; // no draw
Timer.DelayCall(TimeSpan.FromSeconds(120.0), new TimerCallback(
delegate
{
ItemID = m_ClosedId;
}));
}
}
public TombOfKingsSecretDoor(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)m_ClosedId);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_ClosedId = reader.ReadInt();
// make sure we don't get stuck at opened state before deserialize
ItemID = m_ClosedId;
}
}
}