185 lines
3.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|