This commit is contained in:
parent
225e2a25f1
commit
5ce1f041a2
10 changed files with 835 additions and 4 deletions
|
|
@ -178,7 +178,7 @@ namespace Server.Mobiles
|
|||
|
||||
private int m_iRangePerception; // The view area
|
||||
private int m_iRangeFight; // The fight distance
|
||||
|
||||
|
||||
private bool m_bDebugAI; // Show debug AI messages
|
||||
|
||||
private int m_iTeam; // Monster Team
|
||||
|
|
@ -4436,6 +4436,135 @@ namespace Server.Mobiles
|
|||
public virtual bool CanBreath { get { return HasBreath && !Summoned; } }
|
||||
public virtual bool IsDispellable { get { return Summoned && !IsAnimatedDead; } }
|
||||
|
||||
#region Healing
|
||||
public virtual double MinHealDelay { get { return 2.0; } }
|
||||
public virtual double HealScalar { get { return 1.0; } }
|
||||
public virtual bool CanHeal { get { return false; } }
|
||||
public virtual bool CanHealOwner { get { return false; } }
|
||||
|
||||
public double MaxHealDelay
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ControlMaster != null)
|
||||
{
|
||||
double max = ControlMaster.Hits / 10;
|
||||
|
||||
if (max > 10)
|
||||
max = 10;
|
||||
if (max < 1)
|
||||
max = 1;
|
||||
|
||||
return max;
|
||||
}
|
||||
else
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
|
||||
private DateTime m_NextHealTime = DateTime.Now;
|
||||
private Timer m_HealTimer = null;
|
||||
|
||||
public virtual void HealStart()
|
||||
{
|
||||
if (!Alive)
|
||||
return;
|
||||
|
||||
if (CanHeal && Hits != HitsMax)
|
||||
{
|
||||
RevealingAction();
|
||||
|
||||
double seconds = 10 - Dex / 12;
|
||||
|
||||
m_HealTimer = Timer.DelayCall(TimeSpan.FromSeconds(seconds), new TimerStateCallback(Heal_Callback), this);
|
||||
}
|
||||
else if (CanHealOwner && ControlMaster != null && ControlMaster.Hits < ControlMaster.HitsMax && InRange(ControlMaster, 2))
|
||||
{
|
||||
ControlMaster.RevealingAction();
|
||||
|
||||
double seconds = 10 - Dex / 15;
|
||||
double resDelay = (ControlMaster.Alive ? 0.0 : 5.0);
|
||||
|
||||
seconds += resDelay;
|
||||
|
||||
ControlMaster.SendLocalizedMessage(1008078, false, Name); // : Attempting to heal you.
|
||||
|
||||
m_HealTimer = Timer.DelayCall(TimeSpan.FromSeconds(seconds), new TimerStateCallback(Heal_Callback), ControlMaster);
|
||||
}
|
||||
}
|
||||
|
||||
private void Heal_Callback(object state)
|
||||
{
|
||||
if (state is Mobile)
|
||||
Heal((Mobile)state);
|
||||
}
|
||||
|
||||
public virtual void Heal(Mobile patient)
|
||||
{
|
||||
if (!Alive || !patient.Alive || !InRange(patient, 2))
|
||||
{
|
||||
}
|
||||
else if (patient.Poisoned)
|
||||
{
|
||||
double healing = Skills.Healing.Value;
|
||||
double anatomy = Skills.Anatomy.Value;
|
||||
double chance = (healing - 30.0) / 50.0 - patient.Poison.Level * 0.1;
|
||||
|
||||
if ((healing >= 60.0 && anatomy >= 60.0) && chance > Utility.RandomDouble())
|
||||
{
|
||||
if (patient.CurePoison(this))
|
||||
{
|
||||
patient.SendLocalizedMessage(1010059); // You have been cured of all poisons.
|
||||
patient.PlaySound(0x57);
|
||||
|
||||
CheckSkill(SkillName.Healing, 0.0, 100.0);
|
||||
CheckSkill(SkillName.Anatomy, 0.0, 100.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (BleedAttack.IsBleeding(patient))
|
||||
{
|
||||
patient.SendLocalizedMessage(1060167); // The bleeding wounds have healed, you are no longer bleeding!
|
||||
BleedAttack.EndBleed(patient, true);
|
||||
patient.PlaySound(0x57);
|
||||
}
|
||||
else
|
||||
{
|
||||
double healing = Skills.Healing.Value;
|
||||
double anatomy = Skills.Anatomy.Value;
|
||||
double chance = (healing + 10.0) / 100.0;
|
||||
|
||||
if (chance > Utility.RandomDouble())
|
||||
{
|
||||
double min, max;
|
||||
|
||||
min = (anatomy / 10.0) + (healing / 6.0) + 4.0;
|
||||
max = (anatomy / 8.0) + (healing / 3.0) + 4.0;
|
||||
|
||||
if (patient == this)
|
||||
max += 10;
|
||||
|
||||
double toHeal = min + (Utility.RandomDouble() * (max - min));
|
||||
|
||||
toHeal *= HealScalar;
|
||||
|
||||
patient.Heal((int)toHeal);
|
||||
patient.PlaySound(0x57);
|
||||
|
||||
CheckSkill(SkillName.Healing, 0.0, 100.0);
|
||||
CheckSkill(SkillName.Anatomy, 0.0, 100.0);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_HealTimer != null)
|
||||
m_HealTimer.Stop();
|
||||
|
||||
m_HealTimer = null;
|
||||
|
||||
m_NextHealTime = DateTime.Now + TimeSpan.FromSeconds(MinHealDelay + (Utility.RandomDouble() * MaxHealDelay));
|
||||
}
|
||||
#endregion
|
||||
|
||||
public virtual void OnThink()
|
||||
{
|
||||
if ( EnableRummaging && CanRummageCorpses && !Summoned && !Controlled && DateTime.Now >= m_NextRummageTime )
|
||||
|
|
|
|||
|
|
@ -1058,7 +1058,7 @@ namespace Server.Items
|
|||
{
|
||||
double chance = (parry - bushidoNonRacial) / 400.0; // As per OSI, no negitive effect from the Racial stuffs, ie, 120 parry and '0' bushido with humans
|
||||
|
||||
if ( chance <= 0 ) // chance shouldn't go below 0
|
||||
if ( chance < 0 ) // chance shouldn't go below 0
|
||||
chance = 0;
|
||||
|
||||
// Parry/Bushido over 100 grants a 5% bonus.
|
||||
|
|
|
|||
|
|
@ -76,11 +76,11 @@ namespace Server.Items
|
|||
};
|
||||
|
||||
undead.Opposition = new SlayerGroup[]{ humanoid };
|
||||
undead.Super = new SlayerEntry( SlayerName.Silver, typeof( AncientLich ), typeof( Bogle ), typeof( BoneKnight ), typeof( BoneMagi ),/* typeof( DarkGuardian ), */typeof( DarknightCreeper ), typeof( FleshGolem ), typeof( Ghoul ), typeof( GoreFiend ), typeof( HellSteed ), typeof( LadyOfTheSnow ), typeof( Lich ), typeof( LichLord ), typeof( Mummy ), typeof( Revenant ), typeof( RevenantLion ), typeof( RottingCorpse ), typeof( Shade ), typeof( ShadowKnight ), typeof( SkeletalKnight ), typeof( SkeletalMage ), typeof( SkeletalMount ), typeof( Skeleton ), typeof( Spectre ), typeof( Wraith ), typeof( Zombie ) );
|
||||
undead.Super = new SlayerEntry( SlayerName.Silver, typeof( AncientLich ), typeof( Bogle ), typeof( BoneKnight ), typeof( BoneMagi ),/* typeof( DarkGuardian ), */typeof( DarknightCreeper ), typeof( FleshGolem ), typeof( Ghoul ), typeof( GoreFiend ), typeof( HellSteed ), typeof( LadyOfTheSnow ), typeof( Lich ), typeof( LichLord ), typeof( Mummy ), typeof( PestilentBandage ), typeof( Revenant ), typeof( RevenantLion ), typeof( RottingCorpse ), typeof( Shade ), typeof( ShadowKnight ), typeof( SkeletalKnight ), typeof( SkeletalMage ), typeof( SkeletalMount ), typeof( Skeleton ), typeof( Spectre ), typeof( Wraith ), typeof( Zombie ) );
|
||||
undead.Entries = new SlayerEntry[0];
|
||||
|
||||
fey.Opposition = new SlayerGroup[]{ abyss };
|
||||
fey.Super = new SlayerEntry( SlayerName.Fey, typeof( Centaur ), typeof( EtherealWarrior ), typeof( Kirin ), typeof( LordOaks ), typeof( Pixie ), typeof( Silvani ), typeof( Treefellow ), typeof( Unicorn ), typeof( Wisp ) );
|
||||
fey.Super = new SlayerEntry( SlayerName.Fey, typeof( Centaur ), typeof( EtherealWarrior ), typeof( Kirin ), typeof( LordOaks ), typeof( Pixie ), typeof( Silvani ), typeof( Treefellow ), typeof( Unicorn ), typeof( Wisp ), typeof( MLDryad ), typeof( Satyr ) );
|
||||
fey.Entries = new SlayerEntry[0];
|
||||
|
||||
elemental.Opposition = new SlayerGroup[]{ abyss };
|
||||
|
|
|
|||
100
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/CorruptedSoul.cs
Normal file
100
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/CorruptedSoul.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Engines.Quests;
|
||||
using Server.Engines.Quests.Haven;
|
||||
using Server.ContextMenus;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class CorruptedSoul : BaseCreature
|
||||
{
|
||||
public override bool DeleteCorpseOnDeath{ get{ return true; } }
|
||||
|
||||
[Constructable]
|
||||
public CorruptedSoul() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, .1, 5 )
|
||||
{
|
||||
Name = "a corrupted soul";
|
||||
Body = 0x3CA;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 102, 115 );
|
||||
SetDex( 101, 115 );
|
||||
SetInt( 203, 215 );
|
||||
|
||||
SetHits( 61, 69 );
|
||||
|
||||
SetDamage( 2, 21 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 61, 74 );
|
||||
SetResistance( ResistanceType.Fire, 22, 48 );
|
||||
SetResistance( ResistanceType.Cold, 73, 100 );
|
||||
SetResistance( ResistanceType.Poison, 0 );
|
||||
SetResistance( ResistanceType.Energy, 51, 60 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 80.2, 89.4 );
|
||||
SetSkill( SkillName.Tactics, 81.3-89.9 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 88.7 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
// VirtualArmor = 6; Not sure
|
||||
}
|
||||
|
||||
public override bool AlwaysAttackable{ get{ return true; } }
|
||||
public override bool BleedImmune{ get{ return true; } } // NEED TO VERIFY
|
||||
|
||||
// NEED TO VERIFY SOUNDS! Known: No Idle Sound.
|
||||
|
||||
/*public override int GetAngerSound()
|
||||
{
|
||||
return 0x0;
|
||||
}*/
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x233;
|
||||
}
|
||||
|
||||
/*public override int GetDeathSound()
|
||||
{
|
||||
return 0x0;
|
||||
}*/
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
// TODO: Proper OnDeath Effect
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if ( !base.OnBeforeDeath() )
|
||||
return false;
|
||||
|
||||
// 1 in 20 chance that a Thread of Fate will appear in the killer's pack
|
||||
|
||||
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
|
||||
return true;
|
||||
}
|
||||
|
||||
public CorruptedSoul( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
96
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Minotaur.cs
Normal file
96
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Minotaur.cs
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class Minotaur : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Minotaur() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur";
|
||||
Body = 263;
|
||||
|
||||
SetStr( 301, 340 );
|
||||
SetDex( 91, 110 );
|
||||
SetInt( 31, 50 );
|
||||
|
||||
SetHits( 301, 340 );
|
||||
|
||||
SetDamage( 5, 8 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 0 );
|
||||
SetSkill( SkillName.Magery, 0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 56.1, 64.0 );
|
||||
SetSkill( SkillName.Tactics, 93.3, 97.8 );
|
||||
SetSkill( SkillName.Wrestling, 90.4, 92.1 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public Minotaur( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class MinotaurCaptain : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MinotaurCaptain() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur captain";
|
||||
Body = 280;
|
||||
|
||||
SetStr( 401, 425 );
|
||||
SetDex( 91, 110 );
|
||||
SetInt( 31, 50 );
|
||||
|
||||
SetHits( 401, 440 );
|
||||
|
||||
SetDamage( 4, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 35, 45 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 0 );
|
||||
SetSkill( SkillName.Magery, 0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0, 6.3 );
|
||||
SetSkill( SkillName.MagicResist, 66.1, 73.6 );
|
||||
SetSkill( SkillName.Tactics, 93.0, 109.9 );
|
||||
SetSkill( SkillName.Wrestling, 92.6, 107.2 );
|
||||
|
||||
Fame = 7000;
|
||||
Karma = -7000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public MinotaurCaptain( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
97
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurScout.cs
Normal file
97
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurScout.cs
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class MinotaurScout : BaseCreature
|
||||
{
|
||||
|
||||
[Constructable]
|
||||
public MinotaurScout() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur scout";
|
||||
Body = 281;
|
||||
|
||||
SetStr( 353, 375 );
|
||||
SetDex( 111, 130 );
|
||||
SetInt( 34, 50 );
|
||||
|
||||
SetHits( 354, 383 );
|
||||
|
||||
SetDamage( 4, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
//SetSkill( SkillName.Meditation, Unknown );
|
||||
//SetSkill( SkillName.EvalInt, Unknown );
|
||||
//SetSkill( SkillName.Magery, Unknown );
|
||||
//SetSkill( SkillName.Poisoning, Unknown );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 60.6, 67.5 );
|
||||
SetSkill( SkillName.Tactics, 86.9, 103.6 );
|
||||
SetSkill( SkillName.Wrestling, 85.6, 104.5 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public MinotaurScout( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
153
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/PestilentBandage.cs
Normal file
153
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/PestilentBandage.cs
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a pestilent bandage corpse")]
|
||||
public class PestilentBandage : BaseCreature
|
||||
{
|
||||
// Neither Stratics nor UOGuide have much description
|
||||
// beyond being a "Grey Mummy". BodyValue, Sound and
|
||||
// Hue are all guessed until they can be verified.
|
||||
// Loot and Fame/Karma are also guesses at this point.
|
||||
//
|
||||
// They also apparently have a Poison Attack, which I've stolen from Yamandons.
|
||||
[Constructable]
|
||||
public PestilentBandage() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a pestilent bandage";
|
||||
Body = 154;
|
||||
Hue = 0x515;
|
||||
BaseSoundID = 471;
|
||||
|
||||
SetStr( 691, 740 );
|
||||
SetDex( 141, 180 );
|
||||
SetInt( 51, 80 );
|
||||
|
||||
SetHits( 415, 445 );
|
||||
|
||||
SetDamage( 4, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 0.0, 10.0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 75.0, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0, 85.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.0, 75.0 );
|
||||
|
||||
Fame = 20000;
|
||||
Karma = -20000;
|
||||
|
||||
// VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
PackItem( new Bandage( 5 ) ); // How many?
|
||||
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile attacker)
|
||||
{
|
||||
base.OnDamagedBySpell(attacker);
|
||||
|
||||
DoCounter(attacker);
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
DoCounter(attacker);
|
||||
}
|
||||
|
||||
private void DoCounter(Mobile attacker)
|
||||
{
|
||||
if (this.Map == null)
|
||||
return;
|
||||
|
||||
if (attacker is BaseCreature && ((BaseCreature)attacker).BardProvoked)
|
||||
return;
|
||||
|
||||
if (0.2 > Utility.RandomDouble())
|
||||
{
|
||||
/* Counterattack with Hit Poison Area
|
||||
* 20-25 damage, unresistable
|
||||
* Lethal poison, 100% of the time
|
||||
* Particle effect: Type: "2" From: "0x4061A107" To: "0x0" ItemId: "0x36BD" ItemIdName: "explosion" FromLocation: "(296 615, 17)" ToLocation: "(296 615, 17)" Speed: "1" Duration: "10" FixedDirection: "True" Explode: "False" Hue: "0xA6" RenderMode: "0x0" Effect: "0x1F78" ExplodeEffect: "0x1" ExplodeSound: "0x0" Serial: "0x4061A107" Layer: "255" Unknown: "0x0"
|
||||
* Doesn't work on provoked monsters
|
||||
*/
|
||||
|
||||
Mobile target = null;
|
||||
|
||||
if (attacker is BaseCreature)
|
||||
{
|
||||
Mobile m = ((BaseCreature)attacker).GetMaster();
|
||||
|
||||
if (m != null)
|
||||
target = m;
|
||||
}
|
||||
|
||||
if (target == null || !target.InRange(this, 18))
|
||||
target = attacker;
|
||||
|
||||
this.Animate(10, 4, 1, true, false, 0);
|
||||
|
||||
ArrayList targets = new ArrayList();
|
||||
|
||||
foreach (Mobile m in target.GetMobilesInRange(8))
|
||||
{
|
||||
if (m == this || !CanBeHarmful(m))
|
||||
continue;
|
||||
|
||||
if (m is BaseCreature && (((BaseCreature)m).Controlled || ((BaseCreature)m).Summoned || ((BaseCreature)m).Team != this.Team))
|
||||
targets.Add(m);
|
||||
else if (m.Player && m.Alive)
|
||||
targets.Add(m);
|
||||
}
|
||||
|
||||
for (int i = 0; i < targets.Count; ++i)
|
||||
{
|
||||
Mobile m = (Mobile)targets[i];
|
||||
|
||||
DoHarmful(m);
|
||||
|
||||
AOS.Damage(m, this, Utility.RandomMinMax(20, 25), true, 0, 0, 0, 100, 0);
|
||||
|
||||
m.FixedParticles(0x36BD, 1, 10, 0x1F78, 0xA6, 0, (EffectLayer)255);
|
||||
m.ApplyPoison(this, Poison.Lethal);
|
||||
}
|
||||
}
|
||||
}
|
||||
public override bool CanHeal { get { return true; } }
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
public PestilentBandage( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs
Normal file
73
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a troglodyte corpse" )]
|
||||
public class Troglodyte : BaseCreature
|
||||
{
|
||||
|
||||
[Constructable]
|
||||
public Troglodyte() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a troglodyte";
|
||||
Body = 267;
|
||||
BaseSoundID = 0x59F;
|
||||
|
||||
SetStr( 148, 217 );
|
||||
SetDex( 91, 120 );
|
||||
SetInt( 51, 70 );
|
||||
|
||||
SetHits( 302, 340 );
|
||||
|
||||
SetDamage( 5, 6 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 35, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 70.5, 94.8 );
|
||||
SetSkill( SkillName.MagicResist, 51.8, 65.0 );
|
||||
SetSkill( SkillName.Tactics, 80.4, 94.7 );
|
||||
SetSkill( SkillName.Wrestling, 70.2, 93.5 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
PackItem( new Bandage( 5 ) ); // How many?
|
||||
PackItem( new Ribs() );
|
||||
|
||||
}
|
||||
|
||||
public override bool CanHeal { get { return true; } }
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
public Troglodyte( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
87
Scripts/Mobiles/Monsters/ML/Misc/Magic/GreaterDragon.cs
Normal file
87
Scripts/Mobiles/Monsters/ML/Misc/Magic/GreaterDragon.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a dragon corpse" )]
|
||||
public class GreaterDragon : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GreaterDragon () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.3, 0.5 )
|
||||
{
|
||||
Name = "a greater dragon";
|
||||
Body = Utility.RandomList( 12, 59 );
|
||||
BaseSoundID = 362;
|
||||
|
||||
SetStr( 1025, 1425 );
|
||||
SetDex( 81, 148 );
|
||||
SetInt( 475, 675 );
|
||||
|
||||
SetHits( 1000, 2000 );
|
||||
SetStam( 120, 135 );
|
||||
|
||||
SetDamage( 5, 6 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 85 );
|
||||
SetResistance( ResistanceType.Fire, 65, 90 );
|
||||
SetResistance( ResistanceType.Cold, 40, 55 );
|
||||
SetResistance( ResistanceType.Poison, 40, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 75 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Magery, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Tactics, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Wrestling, 115.0, 145.0 );
|
||||
|
||||
Fame = 55000;
|
||||
Karma = -55000;
|
||||
|
||||
VirtualArmor = 60;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 5;
|
||||
MinTameSkill = 104.7;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 4 );
|
||||
AddLoot( LootPack.Gems, 8 );
|
||||
}
|
||||
|
||||
public override bool ReacquireOnMovement{ get{ return !Controlled; } }
|
||||
public override bool HasBreath{ get{ return true; } } // fire breath enabled
|
||||
public override bool AutoDispel{ get{ return !Controlled; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override int Meat{ get{ return 19; } }
|
||||
public override int Hides{ get{ return 20; } }
|
||||
public override HideType HideType{ get{ return HideType.Barbed; } }
|
||||
public override int Scales{ get{ return 7; } }
|
||||
public override ScaleType ScaleType{ get{ return ( Body == 12 ? ScaleType.Yellow : ScaleType.Red ); } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
|
||||
public GreaterDragon( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 0 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue