ModernUO/Projects/UOContent/Items/Special/Evil Home Decor Collection/BedOfNails.cs
2023-03-06 19:28:58 -08:00

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
}