ModernUO/Projects/UOContent/Engines/Khaldun/RaiseSwitch.cs

185 lines
3.9 KiB
C#

using System;
using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0)]
public partial class RaiseSwitch : Item
{
[SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private RaisableItem _raisableItem;
private ResetTimer _resetTimer;
[Constructible]
public RaiseSwitch(int itemID = 0x1093) : base(itemID) => Movable = false;
public override void OnDoubleClick(Mobile m)
{
if (!m.InRange(this, 2))
{
m.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
if (RaisableItem?.Deleted == true)
{
RaisableItem = null;
}
Flip();
if (RaisableItem == null)
{
return;
}
if (RaisableItem.IsRaisable)
{
RaisableItem.Raise();
m.LocalOverheadMessage(
MessageType.Regular,
0x5A,
true,
"You hear a grinding noise echoing in the distance."
);
}
else
{
m.LocalOverheadMessage(
MessageType.Regular,
0x5A,
true,
"You flip the switch again, but nothing happens."
);
}
}
protected virtual void Flip()
{
if (ItemID != 0x1093)
{
ItemID = 0x1093;
StopResetTimer();
}
else
{
ItemID = 0x1095;
StartResetTimer(
RaisableItem?.CloseDelay >= TimeSpan.Zero ? RaisableItem.CloseDelay : TimeSpan.FromMinutes(2.0)
);
}
Effects.PlaySound(Location, Map, 0x3E8);
}
protected void StartResetTimer(TimeSpan delay)
{
StopResetTimer();
_resetTimer = new ResetTimer(this, delay);
_resetTimer.Start();
}
protected void StopResetTimer()
{
if (_resetTimer != null)
{
_resetTimer.Stop();
_resetTimer = null;
}
}
protected virtual void Reset()
{
if (ItemID != 0x1093)
{
Flip();
}
}
[AfterDeserialization(false)]
private void AfterDeserialization()
{
Reset();
}
private class ResetTimer : Timer
{
private readonly RaiseSwitch _raiseSwitch;
public ResetTimer(RaiseSwitch raiseSwitch, TimeSpan delay) : base(delay) => _raiseSwitch = raiseSwitch;
protected override void OnTick()
{
if (_raiseSwitch.Deleted)
{
return;
}
_raiseSwitch._resetTimer = null;
_raiseSwitch.Reset();
}
}
}
[SerializationGenerator(0)]
public partial class DisappearingRaiseSwitch : RaiseSwitch
{
[Constructible]
public DisappearingRaiseSwitch() : base(0x108F)
{
}
public int CurrentRange => Visible ? 3 : 2;
public override bool HandlesOnMovement => true;
protected override void Flip()
{
}
protected override void Reset()
{
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (Utility.InRange(m.Location, Location, CurrentRange) || Utility.InRange(oldLocation, Location, CurrentRange))
{
Refresh();
}
}
public override void OnMapChange()
{
if (!Deleted)
{
Refresh();
}
}
public override void OnLocationChange(Point3D oldLoc)
{
if (!Deleted)
{
Refresh();
}
}
[AfterDeserialization(false)]
public void Refresh()
{
foreach (var mob in GetMobilesInRange(CurrentRange))
{
if (!mob.Hidden || mob.AccessLevel <= AccessLevel.Player)
{
Visible = true;
break;
}
}
}
}