ModernUO/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/ShadowFiend.cs
Kamron Batman fb915992dd
fix(core): Adds Hashed & Hierarchical Timer Wheel (#655)
- Removes TimerPriority
- Removes TimerThread
- Adds a [Hashed & Hierarchical Timer Wheel](http://www.cs.columbia.edu/~nahum/w6998/papers/ton97-timing-wheels.pdf)
2021-07-11 22:42:06 -07:00

129 lines
3.4 KiB
C#

using System;
using Server.Items;
namespace Server.Mobiles
{
public class ShadowFiend : BaseCreature
{
private UnhideTimer m_Timer;
[Constructible]
public ShadowFiend() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 0xA8;
// this to allow shadow fiend to loot from corpses
var backpack = new Backpack();
backpack.Movable = false;
AddItem(backpack);
SetStr(46, 55);
SetDex(121, 130);
SetInt(46, 55);
SetHits(28, 33);
SetStam(46, 55);
SetDamage(10, 22);
SetDamageType(ResistanceType.Physical, 20);
SetDamageType(ResistanceType.Cold, 80);
SetResistance(ResistanceType.Physical, 20, 25);
SetResistance(ResistanceType.Fire, 20, 25);
SetResistance(ResistanceType.Cold, 40, 45);
SetResistance(ResistanceType.Poison, 60, 70);
SetResistance(ResistanceType.Energy, 5, 10);
SetSkill(SkillName.MagicResist, 20.1, 30.0);
SetSkill(SkillName.Tactics, 20.1, 30.0);
SetSkill(SkillName.Wrestling, 20.1, 30.0);
Fame = 1000;
Karma = -1000;
m_Timer = new UnhideTimer(this);
m_Timer.Start();
}
public ShadowFiend(Serial serial) : base(serial)
{
}
public override bool DeleteCorpseOnDeath => true;
public override string DefaultName => "a shadow fiend";
public override bool CanRummageCorpses => true;
public override int GetIdleSound() => 0x37A;
public override int GetAngerSound() => 0x379;
public override int GetDeathSound() => 0x381;
public override int GetAttackSound() => 0x37F;
public override int GetHurtSound() => 0x380;
public override bool OnBeforeDeath()
{
Backpack?.Destroy();
Effects.SendLocationEffect(Location, Map, 0x376A, 10, 1);
return true;
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
m_Timer = new UnhideTimer(this);
m_Timer.Start();
}
public override void OnAfterDelete()
{
m_Timer?.Stop();
m_Timer = null;
base.OnAfterDelete();
}
private class UnhideTimer : Timer
{
private readonly ShadowFiend m_Owner;
public UnhideTimer(ShadowFiend owner) : base(TimeSpan.FromSeconds(30.0))
{
m_Owner = owner;
}
protected override void OnTick()
{
if (m_Owner.Deleted)
{
Stop();
return;
}
foreach (var m in m_Owner.GetMobilesInRange(3))
{
if (m != m_Owner && m.Player && m.Hidden && m_Owner.CanBeHarmful(m) &&
m.AccessLevel == AccessLevel.Player)
{
m.Hidden = false;
}
}
}
}
}
}