180 lines
4.7 KiB
C#
180 lines
4.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Server.Factions;
|
|
using Server.Spells;
|
|
using Server.Targeting;
|
|
|
|
namespace Server
|
|
{
|
|
public sealed class StormsEye : PowerFactionItem
|
|
{
|
|
public StormsEye()
|
|
: base(3967) =>
|
|
Hue = 1165;
|
|
|
|
public StormsEye(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override string DefaultName => "storms eye";
|
|
|
|
public override bool Use(Mobile user)
|
|
{
|
|
if (!Movable)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
user.BeginTarget(
|
|
12,
|
|
true,
|
|
TargetFlags.None,
|
|
(from, obj, stormsEye) =>
|
|
{
|
|
if (!stormsEye.Movable || stormsEye.Deleted || !(obj is IPoint3D pt))
|
|
{
|
|
return;
|
|
}
|
|
|
|
SpellHelper.GetSurfaceTop(ref pt);
|
|
|
|
var origin = new Point3D(pt);
|
|
var facet = from.Map;
|
|
|
|
if (facet?.CanFit(pt.X, pt.Y, pt.Z, 16, false, false) != true)
|
|
{
|
|
return;
|
|
}
|
|
|
|
stormsEye.Movable = false;
|
|
|
|
Effects.SendMovingEffect(
|
|
from,
|
|
new Entity(Serial.Zero, origin, facet),
|
|
ItemID & 0x3FFF,
|
|
7,
|
|
0,
|
|
false,
|
|
false,
|
|
Hue - 1
|
|
);
|
|
|
|
Timer.DelayCall(TimeSpan.FromSeconds(0.5), OnDelay, from, stormsEye, origin, facet);
|
|
},
|
|
this
|
|
);
|
|
|
|
return false;
|
|
}
|
|
|
|
private static void OnDelay(Mobile from, StormsEye stormsEye, Point3D origin, Map facet)
|
|
{
|
|
stormsEye.Delete();
|
|
|
|
Effects.PlaySound(origin, facet, 530);
|
|
Effects.PlaySound(origin, facet, 263);
|
|
|
|
Effects.SendLocationEffect(
|
|
origin,
|
|
facet,
|
|
14284,
|
|
96,
|
|
1,
|
|
0,
|
|
2
|
|
);
|
|
|
|
Timer.DelayCall(TimeSpan.FromSeconds(1.0), OnHit, from, origin, facet);
|
|
}
|
|
|
|
private static void OnHit(Mobile from, Point3D origin, Map facet)
|
|
{
|
|
var targets = facet.GetMobilesInRange(origin, 12)
|
|
.Where(
|
|
mob =>
|
|
from.CanBeHarmful(mob, false) && mob.InLOS(new Point3D(origin, origin.Z + 1)) &&
|
|
Faction.Find(mob) != null
|
|
)
|
|
.ToList();
|
|
|
|
foreach (var mob in targets)
|
|
{
|
|
var damage = mob.Hits * 6 / 10;
|
|
|
|
if (!mob.Player && damage < 10)
|
|
{
|
|
damage = 10;
|
|
}
|
|
else if (damage > 75)
|
|
{
|
|
damage = 75;
|
|
}
|
|
|
|
Effects.SendMovingEffect(
|
|
new Entity(Serial.Zero, new Point3D(origin, origin.Z + 4), facet),
|
|
mob,
|
|
14068,
|
|
1,
|
|
32,
|
|
false,
|
|
false,
|
|
1111,
|
|
2
|
|
);
|
|
|
|
from.DoHarmful(mob);
|
|
|
|
SpellHelper.Damage(
|
|
TimeSpan.FromSeconds(0.50),
|
|
mob,
|
|
from,
|
|
damage / 3.0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
100
|
|
);
|
|
SpellHelper.Damage(
|
|
TimeSpan.FromSeconds(0.70),
|
|
mob,
|
|
from,
|
|
damage / 3.0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
100
|
|
);
|
|
SpellHelper.Damage(
|
|
TimeSpan.FromSeconds(1.00),
|
|
mob,
|
|
from,
|
|
damage / 3.0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
100
|
|
);
|
|
|
|
Timer.DelayCall(TimeSpan.FromSeconds(0.50), mob.PlaySound, 0x1FB);
|
|
}
|
|
}
|
|
|
|
public override void Serialize(IGenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
|
|
writer.WriteEncodedInt(0); // version
|
|
}
|
|
|
|
public override void Deserialize(IGenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
|
|
var version = reader.ReadEncodedInt();
|
|
}
|
|
}
|
|
}
|