using System; using System.Collections; namespace Server.Mobiles { public class HarrowerTentacles : BaseCreature { public override string CorpseName => "a tentacles corpse"; private Mobile m_Harrower; private DrainTimer m_Timer; [CommandProperty( AccessLevel.GameMaster )] public Mobile Harrower { get => m_Harrower; set => m_Harrower = value; } public override string DefaultName => "tentacles of the harrower"; [Constructible] public HarrowerTentacles() : this( null ) { } public HarrowerTentacles( Mobile harrower ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) { m_Harrower = harrower; Body = 129; SetStr( 901, 1000 ); SetDex( 126, 140 ); SetInt( 1001, 1200 ); SetHits( 541, 600 ); SetDamage( 13, 20 ); SetDamageType( ResistanceType.Physical, 20 ); SetDamageType( ResistanceType.Fire, 20 ); SetDamageType( ResistanceType.Cold, 20 ); SetDamageType( ResistanceType.Poison, 20 ); SetDamageType( ResistanceType.Energy, 20 ); SetResistance( ResistanceType.Physical, 55, 65 ); SetResistance( ResistanceType.Fire, 35, 45 ); SetResistance( ResistanceType.Cold, 35, 45 ); SetResistance( ResistanceType.Poison, 35, 45 ); SetResistance( ResistanceType.Energy, 35, 45 ); SetSkill( SkillName.Meditation, 100.0 ); SetSkill( SkillName.MagicResist, 120.1, 140.0 ); SetSkill( SkillName.Swords, 90.1, 100.0 ); SetSkill( SkillName.Tactics, 90.1, 100.0 ); SetSkill( SkillName.Wrestling, 90.1, 100.0 ); Fame = 15000; Karma = -15000; VirtualArmor = 60; m_Timer = new DrainTimer( this ); m_Timer.Start(); PackReg( 50 ); PackNecroReg( 15, 75 ); } public override void CheckReflect( Mobile caster, ref bool reflect ) { reflect = true; } public override int GetIdleSound() { return 0x101; } public override int GetAngerSound() { return 0x5E; } public override int GetDeathSound() { return 0x1C2; } public override int GetAttackSound() { return -1; // unknown } public override int GetHurtSound() { return 0x289; } public override void GenerateLoot() { AddLoot( LootPack.FilthyRich, 2 ); AddLoot( LootPack.MedScrolls, 3 ); AddLoot( LootPack.HighScrolls, 2 ); } public override bool AutoDispel => true; public override bool Unprovokable => true; public override Poison PoisonImmune => Poison.Lethal; public override bool DisallowAllMoves => true; public HarrowerTentacles( Serial serial ) : base( serial ) { } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 0 ); // version writer.Write( m_Harrower ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 0: { m_Harrower = reader.ReadMobile(); m_Timer = new DrainTimer( this ); m_Timer.Start(); break; } } } public override void OnAfterDelete() { m_Timer?.Stop(); m_Timer = null; base.OnAfterDelete(); } private class DrainTimer : Timer { private HarrowerTentacles m_Owner; public DrainTimer( HarrowerTentacles owner ) : base( TimeSpan.FromSeconds( 5.0 ), TimeSpan.FromSeconds( 5.0 ) ) { m_Owner = owner; Priority = TimerPriority.TwoFiftyMS; } private static ArrayList m_ToDrain = new ArrayList(); protected override void OnTick() { if ( m_Owner.Deleted ) { Stop(); return; } foreach ( Mobile m in m_Owner.GetMobilesInRange( 9 ) ) { if ( m == m_Owner || m == m_Owner.Harrower || !m_Owner.CanBeHarmful( m ) ) continue; if ( m is BaseCreature ) { BaseCreature bc = m as BaseCreature; if ( bc.Controlled || bc.Summoned ) m_ToDrain.Add( m ); } else if ( m.Player ) { m_ToDrain.Add( m ); } } foreach ( Mobile m in m_ToDrain ) { m_Owner.DoHarmful( m ); m.FixedParticles( 0x374A, 10, 15, 5013, 0x455, 0, EffectLayer.Waist ); m.PlaySound( 0x1F1 ); int drain = Utility.RandomMinMax( 14, 30 ); m_Owner.Hits += drain; if ( m_Owner.Harrower != null ) m_Owner.Harrower.Hits += drain; m.Damage( drain, m_Owner ); } m_ToDrain.Clear(); } } } }