141 lines
3.8 KiB
C#
141 lines
3.8 KiB
C#
using System;
|
|
using ModernUO.Serialization;
|
|
|
|
namespace Server.Items;
|
|
|
|
[SerializationGenerator(0)]
|
|
public partial class BedOfNailsComponent : AddonComponent
|
|
{
|
|
public BedOfNailsComponent(int itemID) : base(itemID)
|
|
{
|
|
}
|
|
|
|
public override int LabelNumber => 1074801; // Bed of Nails
|
|
|
|
public override bool OnMoveOver(Mobile m)
|
|
{
|
|
var allow = base.OnMoveOver(m);
|
|
|
|
if (allow && Addon is BedOfNailsAddon addon)
|
|
{
|
|
addon.OnMoveOver(m);
|
|
}
|
|
|
|
return allow;
|
|
}
|
|
}
|
|
|
|
[FlippableAddon(Direction.South, Direction.East)]
|
|
[SerializationGenerator(0)]
|
|
public partial class BedOfNailsAddon : BaseAddon
|
|
{
|
|
private InternalTimer _timer;
|
|
|
|
[Constructible]
|
|
public BedOfNailsAddon()
|
|
{
|
|
Direction = Direction.South;
|
|
|
|
AddComponent(new BedOfNailsComponent(0x2A81), 0, 0, 0);
|
|
AddComponent(new BedOfNailsComponent(0x2A82), 0, -1, 0);
|
|
}
|
|
|
|
public override BaseAddonDeed Deed => new BedOfNailsDeed();
|
|
|
|
public override bool OnMoveOver(Mobile m)
|
|
{
|
|
if (m.Alive && (m.AccessLevel == AccessLevel.Player || !m.Hidden))
|
|
{
|
|
if (m.Player)
|
|
{
|
|
Effects.PlaySound(
|
|
Location,
|
|
Map,
|
|
m.Female ? Utility.RandomMinMax(0x53B, 0x53D) : Utility.RandomMinMax(0x53E, 0x540)
|
|
);
|
|
}
|
|
|
|
if (_timer?.Running != true)
|
|
{
|
|
(_timer = new InternalTimer(m)).Start();
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public virtual void Flip(Mobile from, Direction direction)
|
|
{
|
|
switch (direction)
|
|
{
|
|
case Direction.East:
|
|
{
|
|
AddComponent(new BedOfNailsComponent(0x2A89), 0, 0, 0);
|
|
AddComponent(new BedOfNailsComponent(0x2A8A), -1, 0, 0);
|
|
break;
|
|
}
|
|
case Direction.South:
|
|
{
|
|
AddComponent(new BedOfNailsComponent(0x2A81), 0, 0, 0);
|
|
AddComponent(new BedOfNailsComponent(0x2A82), 0, -1, 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private class InternalTimer : Timer
|
|
{
|
|
private readonly Mobile _mobile;
|
|
private Point3D _location;
|
|
|
|
public InternalTimer(Mobile m) : base(TimeSpan.Zero, TimeSpan.FromSeconds(1), 5)
|
|
{
|
|
_mobile = m;
|
|
_location = Point3D.Zero;
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
if (_mobile?.Map == null || _mobile.Deleted || !_mobile.Alive || _mobile.Map == Map.Internal)
|
|
{
|
|
Stop();
|
|
}
|
|
else if (_location != _mobile.Location)
|
|
{
|
|
var amount = Utility.RandomMinMax(0, 7);
|
|
|
|
for (var i = 0; i < amount; i++)
|
|
{
|
|
var x = _mobile.X + Utility.RandomMinMax(-1, 1);
|
|
var y = _mobile.Y + Utility.RandomMinMax(-1, 1);
|
|
var z = _mobile.Z;
|
|
|
|
if (!_mobile.Map.CanFit(x, y, z, 1, false, false))
|
|
{
|
|
z = _mobile.Map.GetAverageZ(x, y);
|
|
|
|
if (!_mobile.Map.CanFit(x, y, z, 1, false, false))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
var blood = new Blood(Utility.RandomMinMax(0x122C, 0x122F));
|
|
blood.MoveToWorld(new Point3D(x, y, z), _mobile.Map);
|
|
}
|
|
|
|
_location = _mobile.Location;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
[SerializationGenerator(0)]
|
|
public partial class BedOfNailsDeed : BaseAddonDeed
|
|
{
|
|
[Constructible]
|
|
public BedOfNailsDeed() => LootType = LootType.Blessed;
|
|
|
|
public override BaseAddon Addon => new BedOfNailsAddon();
|
|
public override int LabelNumber => 1074801; // Bed of Nails
|
|
}
|