#W# Source and Scripts added. Added Scripts/Settings.cs to expose some basic tweak able settings.
This commit is contained in:
parent
b51c58f514
commit
3045c83799
3512 changed files with 627673 additions and 0 deletions
92
Scripts/Mobiles/Monsters/AOS/AbysmalHorror.cs
Normal file
92
Scripts/Mobiles/Monsters/AOS/AbysmalHorror.cs
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an abyssmal horror corpse" )]
|
||||
public class AbysmalHorror : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return Utility.RandomBool() ? WeaponAbility.MortalStrike : WeaponAbility.WhirlwindAttack;
|
||||
}
|
||||
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
[Constructable]
|
||||
public AbysmalHorror() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an abyssmal horror";
|
||||
Body = 312;
|
||||
BaseSoundID = 0x451;
|
||||
|
||||
SetStr( 401, 420 );
|
||||
SetDex( 81, 90 );
|
||||
SetInt( 401, 420 );
|
||||
|
||||
SetHits( 6000 );
|
||||
|
||||
SetDamage( 13, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 100 );
|
||||
SetResistance( ResistanceType.Cold, 50, 55 );
|
||||
SetResistance( ResistanceType.Poison, 60, 65 );
|
||||
SetResistance( ResistanceType.Energy, 77, 80 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 200.0 );
|
||||
SetSkill( SkillName.Magery, 112.6, 117.5 );
|
||||
SetSkill( SkillName.Meditation, 200.0 );
|
||||
SetSkill( SkillName.MagicResist, 117.6, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 84.1, 88.0 );
|
||||
|
||||
Fame = 26000;
|
||||
Karma = -26000;
|
||||
|
||||
VirtualArmor = 54;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return !Core.SE; } }
|
||||
public override bool Unprovokable{ get{ return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public AbysmalHorror( 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();
|
||||
|
||||
if ( BaseSoundID == 357 )
|
||||
BaseSoundID = 0x451;
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/AOS/BoneDemon.cs
Normal file
75
Scripts/Mobiles/Monsters/AOS/BoneDemon.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a bone demon corpse" )]
|
||||
public class BoneDemon : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BoneDemon() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a bone demon";
|
||||
Body = 308;
|
||||
BaseSoundID = 0x48D;
|
||||
|
||||
SetStr( 1000 );
|
||||
SetDex( 151, 175 );
|
||||
SetInt( 171, 220 );
|
||||
|
||||
SetHits( 3600 );
|
||||
|
||||
SetDamage( 34, 36 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 75 );
|
||||
SetResistance( ResistanceType.Fire, 60 );
|
||||
SetResistance( ResistanceType.Cold, 90 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 60 );
|
||||
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.EvalInt, 77.6, 87.5 );
|
||||
SetSkill( SkillName.Magery, 77.6, 87.5 );
|
||||
SetSkill( SkillName.Meditation, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 100.0 );
|
||||
|
||||
Fame = 20000;
|
||||
Karma = -20000;
|
||||
|
||||
VirtualArmor = 44;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 8 );
|
||||
}
|
||||
|
||||
public override bool BardImmune { get { return !Core.SE; } }
|
||||
public override bool Unprovokable { get { return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public BoneDemon( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/AOS/CrystalElemental.cs
Normal file
78
Scripts/Mobiles/Monsters/AOS/CrystalElemental.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a crystal elemental corpse" )]
|
||||
public class CrystalElemental : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public CrystalElemental() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a crystal elemental";
|
||||
Body = 300;
|
||||
BaseSoundID = 278;
|
||||
|
||||
SetStr( 136, 160 );
|
||||
SetDex( 51, 65 );
|
||||
SetInt( 86, 110 );
|
||||
|
||||
SetHits( 150 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Energy, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 55, 70 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.1, 75.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 75.0 );
|
||||
SetSkill( SkillName.Meditation, 65.1, 75.0 );
|
||||
SetSkill( SkillName.MagicResist, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Tactics, 75.1, 85.0 );
|
||||
SetSkill( SkillName.Wrestling, 65.1, 75.0 );
|
||||
|
||||
Fame = 6500;
|
||||
Karma = -6500;
|
||||
|
||||
VirtualArmor = 54;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public CrystalElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
94
Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs
Normal file
94
Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a darknight creeper corpse" )]
|
||||
public class DarknightCreeper : BaseCreature
|
||||
{
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
[Constructable]
|
||||
public DarknightCreeper() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "darknight creeper" );
|
||||
Body = 313;
|
||||
BaseSoundID = 0xE0;
|
||||
|
||||
SetStr( 301, 330 );
|
||||
SetDex( 101, 110 );
|
||||
SetInt( 301, 330 );
|
||||
|
||||
SetHits( 4000 );
|
||||
|
||||
SetDamage( 22, 26 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 85 );
|
||||
SetDamageType( ResistanceType.Poison, 15 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60 );
|
||||
SetResistance( ResistanceType.Fire, 60 );
|
||||
SetResistance( ResistanceType.Cold, 100 );
|
||||
SetResistance( ResistanceType.Poison, 90 );
|
||||
SetResistance( ResistanceType.Energy, 75 );
|
||||
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.EvalInt, 118.1, 120.0 );
|
||||
SetSkill( SkillName.Magery, 112.6, 120.0 );
|
||||
SetSkill( SkillName.Meditation, 150.0 );
|
||||
SetSkill( SkillName.Poisoning, 120.0 );
|
||||
SetSkill( SkillName.MagicResist, 90.1, 90.9 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 90.9 );
|
||||
SetSkill( SkillName.Necromancy, 120.1, 130.0 );
|
||||
SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 );
|
||||
|
||||
Fame = 22000;
|
||||
Karma = -22000;
|
||||
|
||||
VirtualArmor = 34;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return !Core.SE; } }
|
||||
public override bool Unprovokable{ get{ return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public DarknightCreeper( 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();
|
||||
|
||||
if ( BaseSoundID == 471 )
|
||||
BaseSoundID = 0xE0;
|
||||
}
|
||||
}
|
||||
}
|
||||
293
Scripts/Mobiles/Monsters/AOS/DemonKnight.cs
Normal file
293
Scripts/Mobiles/Monsters/AOS/DemonKnight.cs
Normal file
|
|
@ -0,0 +1,293 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a demon knight corpse" )]
|
||||
public class DemonKnight : BaseCreature
|
||||
{
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
public static Type[] ArtifactRarity10 { get { return m_ArtifactRarity10; } }
|
||||
public static Type[] ArtifactRarity11 { get { return m_ArtifactRarity11; } }
|
||||
private static Type[] m_ArtifactRarity10 = new Type[]
|
||||
{
|
||||
typeof( LegacyOfTheDreadLord ),
|
||||
typeof( TheTaskmaster )
|
||||
};
|
||||
|
||||
private static Type[] m_ArtifactRarity11 = new Type[]
|
||||
{
|
||||
typeof( TheDragonSlayer ),
|
||||
typeof( ArmorOfFortune ),
|
||||
typeof( GauntletsOfNobility ),
|
||||
typeof( HelmOfInsight ),
|
||||
typeof( HolyKnightsBreastplate ),
|
||||
typeof( JackalsCollar ),
|
||||
typeof( LeggingsOfBane ),
|
||||
typeof( MidnightBracers ),
|
||||
typeof( OrnateCrownOfTheHarrower ),
|
||||
typeof( ShadowDancerLeggings ),
|
||||
typeof( TunicOfFire ),
|
||||
typeof( VoiceOfTheFallenKing ),
|
||||
typeof( BraceletOfHealth ),
|
||||
typeof( OrnamentOfTheMagician ),
|
||||
typeof( RingOfTheElements ),
|
||||
typeof( RingOfTheVile ),
|
||||
typeof( Aegis ),
|
||||
typeof( ArcaneShield ),
|
||||
typeof( AxeOfTheHeavens ),
|
||||
typeof( BladeOfInsanity ),
|
||||
typeof( BoneCrusher ),
|
||||
typeof( BreathOfTheDead ),
|
||||
typeof( Frostbringer ),
|
||||
typeof( SerpentsFang ),
|
||||
typeof( StaffOfTheMagi ),
|
||||
typeof( TheBeserkersMaul ),
|
||||
typeof( TheDryadBow ),
|
||||
typeof( DivineCountenance ),
|
||||
typeof( HatOfTheMagi ),
|
||||
typeof( HuntersHeaddress ),
|
||||
typeof( SpiritOfTheTotem )
|
||||
};
|
||||
|
||||
public static Item CreateRandomArtifact()
|
||||
{
|
||||
if ( !Core.AOS )
|
||||
return null;
|
||||
|
||||
int count = ( m_ArtifactRarity10.Length * 5 ) + ( m_ArtifactRarity11.Length * 4 );
|
||||
int random = Utility.Random( count );
|
||||
Type type;
|
||||
|
||||
if ( random < ( m_ArtifactRarity10.Length * 5 ) )
|
||||
{
|
||||
type = m_ArtifactRarity10[random / 5];
|
||||
}
|
||||
else
|
||||
{
|
||||
random -= m_ArtifactRarity10.Length * 5;
|
||||
type = m_ArtifactRarity11[random / 4];
|
||||
}
|
||||
|
||||
return Loot.Construct( type );
|
||||
}
|
||||
|
||||
public static Mobile FindRandomPlayer( BaseCreature creature )
|
||||
{
|
||||
List<DamageStore> rights = BaseCreature.GetLootingRights( creature.DamageEntries, creature.HitsMax );
|
||||
|
||||
for ( int i = rights.Count - 1; i >= 0; --i )
|
||||
{
|
||||
DamageStore ds = rights[i];
|
||||
|
||||
if ( !ds.m_HasRight )
|
||||
rights.RemoveAt( i );
|
||||
}
|
||||
|
||||
if ( rights.Count > 0 )
|
||||
return rights[Utility.Random( rights.Count )].m_Mobile;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void DistributeArtifact( BaseCreature creature )
|
||||
{
|
||||
DistributeArtifact( creature, CreateRandomArtifact() );
|
||||
}
|
||||
|
||||
public static void DistributeArtifact( BaseCreature creature, Item artifact )
|
||||
{
|
||||
DistributeArtifact( FindRandomPlayer( creature ), artifact );
|
||||
}
|
||||
|
||||
public static void DistributeArtifact( Mobile to )
|
||||
{
|
||||
DistributeArtifact( to, CreateRandomArtifact() );
|
||||
}
|
||||
|
||||
public static void DistributeArtifact( Mobile to, Item artifact )
|
||||
{
|
||||
if ( to == null || artifact == null )
|
||||
return;
|
||||
|
||||
Container pack = to.Backpack;
|
||||
|
||||
if ( pack == null || !pack.TryDropItem( to, artifact, false ) )
|
||||
to.BankBox.DropItem( artifact );
|
||||
|
||||
to.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
|
||||
}
|
||||
|
||||
public static int GetArtifactChance( Mobile boss )
|
||||
{
|
||||
if ( !Core.AOS )
|
||||
return 0;
|
||||
|
||||
int luck = LootPack.GetLuckChanceForKiller( boss );
|
||||
int chance;
|
||||
|
||||
if ( boss is DemonKnight )
|
||||
chance = 1500 + (luck / 5);
|
||||
else
|
||||
chance = 750 + (luck / 10);
|
||||
|
||||
return chance;
|
||||
}
|
||||
|
||||
public static bool CheckArtifactChance( Mobile boss )
|
||||
{
|
||||
return GetArtifactChance( boss ) > Utility.Random( 100000 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
switch ( Utility.Random( 3 ) )
|
||||
{
|
||||
default:
|
||||
case 0: return WeaponAbility.DoubleStrike;
|
||||
case 1: return WeaponAbility.WhirlwindAttack;
|
||||
case 2: return WeaponAbility.CrushingBlow;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public DemonKnight() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "demon knight" );
|
||||
Title = "the Dark Father";
|
||||
Body = 318;
|
||||
BaseSoundID = 0x165;
|
||||
|
||||
SetStr( 500 );
|
||||
SetDex( 100 );
|
||||
SetInt( 1000 );
|
||||
|
||||
SetHits( 30000 );
|
||||
SetMana( 5000 );
|
||||
|
||||
SetDamage( 17, 21 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Fire, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
SetDamageType( ResistanceType.Energy, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30 );
|
||||
SetResistance( ResistanceType.Fire, 30 );
|
||||
SetResistance( ResistanceType.Cold, 30 );
|
||||
SetResistance( ResistanceType.Poison, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30 );
|
||||
|
||||
SetSkill( SkillName.Necromancy, 120, 120.0 );
|
||||
SetSkill( SkillName.SpiritSpeak, 120.0, 120.0 );
|
||||
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.EvalInt, 100.0 );
|
||||
SetSkill( SkillName.Magery, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 120.0 );
|
||||
SetSkill( SkillName.MagicResist, 150.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 120.0 );
|
||||
|
||||
Fame = 28000;
|
||||
Karma = -28000;
|
||||
|
||||
VirtualArmor = 64;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.SuperBoss, 2 );
|
||||
AddLoot( LootPack.HighScrolls, Utility.RandomMinMax( 6, 60 ) );
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return !Core.SE; } }
|
||||
public override bool Unprovokable{ get{ return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
private static bool m_InHere;
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
if ( from != null && from != this && !m_InHere )
|
||||
{
|
||||
m_InHere = true;
|
||||
AOS.Damage( from, this, Utility.RandomMinMax( 8, 20 ), 100, 0, 0, 0, 0 );
|
||||
|
||||
MovingEffect( from, 0xECA, 10, 0, false, false, 0, 0 );
|
||||
PlaySound( 0x491 );
|
||||
|
||||
if ( 0.05 > Utility.RandomDouble() )
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerStateCallback( CreateBones_Callback ), from );
|
||||
|
||||
m_InHere = false;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void CreateBones_Callback( object state )
|
||||
{
|
||||
Mobile from = (Mobile)state;
|
||||
Map map = from.Map;
|
||||
|
||||
if ( map == null )
|
||||
return;
|
||||
|
||||
int count = Utility.RandomMinMax( 1, 3 );
|
||||
|
||||
for ( int i = 0; i < count; ++i )
|
||||
{
|
||||
int x = from.X + Utility.RandomMinMax( -1, 1 );
|
||||
int y = from.Y + Utility.RandomMinMax( -1, 1 );
|
||||
int z = from.Z;
|
||||
|
||||
if ( !map.CanFit( x, y, z, 16, false, true ) )
|
||||
{
|
||||
z = map.GetAverageZ( x, y );
|
||||
|
||||
if ( z == from.Z || !map.CanFit( x, y, z, 16, false, true ) )
|
||||
continue;
|
||||
}
|
||||
|
||||
UnholyBone bone = new UnholyBone();
|
||||
|
||||
bone.Hue = 0;
|
||||
bone.Name = "unholy bones";
|
||||
bone.ItemID = Utility.Random( 0xECA, 9 );
|
||||
|
||||
bone.MoveToWorld( new Point3D( x, y, z ), map );
|
||||
}
|
||||
}
|
||||
|
||||
public DemonKnight( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/AOS/Devourer.cs
Normal file
75
Scripts/Mobiles/Monsters/AOS/Devourer.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a devourer of souls corpse" )]
|
||||
public class Devourer : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Devourer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a devourer of souls";
|
||||
Body = 303;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 801, 950 );
|
||||
SetDex( 126, 175 );
|
||||
SetInt( 201, 250 );
|
||||
|
||||
SetHits( 650 );
|
||||
|
||||
SetDamage( 22, 26 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Cold, 20 );
|
||||
SetDamageType( ResistanceType.Energy, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 60, 70 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
|
||||
SetSkill( SkillName.Tactics, 75.1, 85.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
Fame = 9500;
|
||||
Karma = -9500;
|
||||
|
||||
VirtualArmor = 44;
|
||||
|
||||
PackNecroReg( 24, 45 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int Meat{ get{ return 3; } }
|
||||
|
||||
public Devourer( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/AOS/FleshGolem.cs
Normal file
72
Scripts/Mobiles/Monsters/AOS/FleshGolem.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a flesh golem corpse" )]
|
||||
public class FleshGolem : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public FleshGolem() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a flesh golem";
|
||||
Body = 304;
|
||||
BaseSoundID = 684;
|
||||
|
||||
SetStr( 176, 200 );
|
||||
SetDex( 51, 75 );
|
||||
SetInt( 46, 70 );
|
||||
|
||||
SetHits( 106, 120 );
|
||||
|
||||
SetDamage( 18, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 60, 70 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 55.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1800;
|
||||
|
||||
VirtualArmor = 34;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public FleshGolem( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
117
Scripts/Mobiles/Monsters/AOS/FleshRenderer.cs
Normal file
117
Scripts/Mobiles/Monsters/AOS/FleshRenderer.cs
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a fleshrenderer corpse" )]
|
||||
public class FleshRenderer : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
[Constructable]
|
||||
public FleshRenderer() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a fleshrenderer";
|
||||
Body = 315;
|
||||
|
||||
SetStr( 401, 460 );
|
||||
SetDex( 201, 210 );
|
||||
SetInt( 221, 260 );
|
||||
|
||||
SetHits( 4500 );
|
||||
|
||||
SetDamage( 16, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 80, 90 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 70, 80 );
|
||||
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 155.1, 160.0 );
|
||||
SetSkill( SkillName.Meditation, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 23000;
|
||||
Karma = -23000;
|
||||
|
||||
VirtualArmor = 24;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
public override bool AutoDispel{ get{ return true; } }
|
||||
public override bool BardImmune { get { return !Core.SE; } }
|
||||
public override bool Unprovokable { get { return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x34C;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x354;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x34C;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x34C;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x354;
|
||||
}
|
||||
|
||||
public FleshRenderer( 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();
|
||||
|
||||
if ( BaseSoundID == 660 )
|
||||
BaseSoundID = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Scripts/Mobiles/Monsters/AOS/Gibberling.cs
Normal file
73
Scripts/Mobiles/Monsters/AOS/Gibberling.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gibberling corpse" )]
|
||||
public class Gibberling : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Gibberling() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a gibberling";
|
||||
Body = 307;
|
||||
BaseSoundID = 422;
|
||||
|
||||
SetStr( 141, 165 );
|
||||
SetDex( 101, 125 );
|
||||
SetInt( 56, 80 );
|
||||
|
||||
SetHits( 85, 99 );
|
||||
|
||||
SetDamage( 12, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Fire, 40 );
|
||||
SetDamageType( ResistanceType.Energy, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 45.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 67.6, 92.5 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 1500;
|
||||
Karma = -1500;
|
||||
|
||||
VirtualArmor = 27;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public Gibberling( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/AOS/GoreFiend.cs
Normal file
72
Scripts/Mobiles/Monsters/AOS/GoreFiend.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gore fiend corpse" )]
|
||||
public class GoreFiend : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GoreFiend() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a gore fiend";
|
||||
Body = 305;
|
||||
BaseSoundID = 224;
|
||||
|
||||
SetStr( 161, 185 );
|
||||
SetDex( 41, 65 );
|
||||
SetInt( 46, 70 );
|
||||
|
||||
SetHits( 97, 111 );
|
||||
|
||||
SetDamage( 15, 21 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 85 );
|
||||
SetDamageType( ResistanceType.Poison, 15 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 5, 15 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
|
||||
|
||||
Fame = 1500;
|
||||
Karma = -1500;
|
||||
|
||||
VirtualArmor = 24;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 1218;
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public GoreFiend( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
94
Scripts/Mobiles/Monsters/AOS/Impaler.cs
Normal file
94
Scripts/Mobiles/Monsters/AOS/Impaler.cs
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an impaler corpse" )]
|
||||
public class Impaler : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return Utility.RandomBool() ? WeaponAbility.MortalStrike : WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
[Constructable]
|
||||
public Impaler() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "impaler" );
|
||||
Body = 306;
|
||||
BaseSoundID = 0x2A7;
|
||||
|
||||
SetStr( 190 );
|
||||
SetDex( 45 );
|
||||
SetInt( 190 );
|
||||
|
||||
SetHits( 5000 );
|
||||
|
||||
SetDamage( 31, 35 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 90 );
|
||||
SetResistance( ResistanceType.Fire, 60 );
|
||||
SetResistance( ResistanceType.Cold, 75 );
|
||||
SetResistance( ResistanceType.Poison, 60 );
|
||||
SetResistance( ResistanceType.Energy, 100 );
|
||||
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.Meditation, 120.0 );
|
||||
SetSkill( SkillName.Poisoning, 160.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0 );
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
|
||||
VirtualArmor = 49;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
public override bool AutoDispel{ get{ return true; } }
|
||||
public override bool BardImmune{ get{ return !Core.SE; } }
|
||||
public override bool Unprovokable{ get{ return Core.SE; } }
|
||||
public override bool AreaPeaceImmune { get { return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override Poison HitPoison{ get{ return (0.8 >= Utility.RandomDouble() ? Poison.Greater : Poison.Deadly); } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public Impaler( 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();
|
||||
|
||||
if ( BaseSoundID == 1200 )
|
||||
BaseSoundID = 0x2A7;
|
||||
}
|
||||
}
|
||||
}
|
||||
66
Scripts/Mobiles/Monsters/AOS/MoundOfMaggots.cs
Normal file
66
Scripts/Mobiles/Monsters/AOS/MoundOfMaggots.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a maggoty corpse" )] // TODO: Corpse name?
|
||||
public class MoundOfMaggots : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MoundOfMaggots() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a mound of maggots";
|
||||
Body = 319;
|
||||
BaseSoundID = 898;
|
||||
|
||||
SetStr( 61, 70 );
|
||||
SetDex( 61, 70 );
|
||||
SetInt( 10 );
|
||||
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 3, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 90 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
|
||||
SetSkill( SkillName.Tactics, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
VirtualArmor = 24;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public MoundOfMaggots( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/AOS/PatchworkSkeleton.cs
Normal file
75
Scripts/Mobiles/Monsters/AOS/PatchworkSkeleton.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a patchwork skeletal corpse" )]
|
||||
public class PatchworkSkeleton : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public PatchworkSkeleton() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a patchwork skeleton";
|
||||
Body = 309;
|
||||
BaseSoundID = 0x48D;
|
||||
|
||||
SetStr( 96, 120 );
|
||||
SetDex( 71, 95 );
|
||||
SetInt( 16, 40 );
|
||||
|
||||
SetHits( 58, 72 );
|
||||
|
||||
SetDamage( 18, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 85 );
|
||||
SetDamageType( ResistanceType.Cold, 15 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 70, 80 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 55.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
|
||||
|
||||
Fame = 500;
|
||||
Karma = -500;
|
||||
|
||||
VirtualArmor = 54;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public PatchworkSkeleton( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
69
Scripts/Mobiles/Monsters/AOS/Ravager.cs
Normal file
69
Scripts/Mobiles/Monsters/AOS/Ravager.cs
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ravager corpse" )]
|
||||
public class Ravager : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.CrushingBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Ravager() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a ravager";
|
||||
Body = 314;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 251, 275 );
|
||||
SetDex( 101, 125 );
|
||||
SetInt( 66, 90 );
|
||||
|
||||
SetHits( 161, 175 );
|
||||
|
||||
SetDamage( 15, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 75.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 54;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public Ravager( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
183
Scripts/Mobiles/Monsters/AOS/Revenant.cs
Normal file
183
Scripts/Mobiles/Monsters/AOS/Revenant.cs
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class Revenant : BaseCreature
|
||||
{
|
||||
private Mobile m_Target;
|
||||
private DateTime m_ExpireTime;
|
||||
|
||||
public override void DisplayPaperdollTo( Mobile to )
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
public override Mobile ConstantFocus{ get{ return m_Target; } }
|
||||
public override bool NoHouseRestrictions{ get{ return true; } }
|
||||
|
||||
public override double DispelDifficulty{ get{ return 80.0; } }
|
||||
public override double DispelFocus{ get{ return 20.0; } }
|
||||
|
||||
public Revenant( Mobile caster, Mobile target, TimeSpan duration ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 )
|
||||
{
|
||||
Name = "a revenant";
|
||||
Body = 400;
|
||||
Hue = 1;
|
||||
// TODO: Sound values?
|
||||
|
||||
double scalar = caster.Skills[SkillName.SpiritSpeak].Value * 0.01;
|
||||
|
||||
m_Target = target;
|
||||
m_ExpireTime = DateTime.UtcNow + duration;
|
||||
|
||||
SetStr( 200 );
|
||||
SetDex( 150 );
|
||||
SetInt( 150 );
|
||||
|
||||
SetDamage( 16, 17 );
|
||||
|
||||
// Bestiary says 50 phys 50 cold, animal lore says differently
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 100.0 * scalar ); // magic resist is absolute value of spiritspeak
|
||||
SetSkill( SkillName.Tactics, 100.0 ); // always 100
|
||||
SetSkill( SkillName.Swords, 100.0 * scalar ); // not displayed in animal lore but tests clearly show this is influenced
|
||||
SetSkill( SkillName.DetectHidden, 75.0 * scalar );
|
||||
|
||||
scalar /= 1.2;
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
|
||||
SetResistance( ResistanceType.Cold, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
|
||||
SetResistance( ResistanceType.Fire, (int)(20 * scalar) );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
|
||||
|
||||
Fame = 0;
|
||||
Karma = 0;
|
||||
|
||||
ControlSlots = 3;
|
||||
|
||||
VirtualArmor = 32;
|
||||
|
||||
Item shroud = new DeathShroud();
|
||||
|
||||
shroud.Hue = 0x455;
|
||||
|
||||
shroud.Movable = false;
|
||||
|
||||
AddItem( shroud );
|
||||
|
||||
Halberd weapon = new Halberd();
|
||||
|
||||
weapon.Hue = 1;
|
||||
weapon.Movable = false;
|
||||
|
||||
AddItem( weapon );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override bool BardImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
if ( !m_Target.Alive || DateTime.UtcNow > m_ExpireTime )
|
||||
{
|
||||
Kill();
|
||||
return;
|
||||
}
|
||||
else if ( Map != m_Target.Map || !InRange( m_Target, 15 ) )
|
||||
{
|
||||
Map fromMap = Map;
|
||||
Point3D from = Location;
|
||||
|
||||
Map toMap = m_Target.Map;
|
||||
Point3D to = m_Target.Location;
|
||||
|
||||
if ( toMap != null )
|
||||
{
|
||||
for ( int i = 0; i < 5; ++i )
|
||||
{
|
||||
Point3D loc = new Point3D( to.X - 4 + Utility.Random( 9 ), to.Y - 4 + Utility.Random( 9 ), to.Z );
|
||||
|
||||
if ( toMap.CanSpawnMobile( loc ) )
|
||||
{
|
||||
to = loc;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
loc.Z = toMap.GetAverageZ( loc.X, loc.Y );
|
||||
|
||||
if ( toMap.CanSpawnMobile( loc ) )
|
||||
{
|
||||
to = loc;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map = toMap;
|
||||
Location = to;
|
||||
|
||||
ProcessDelta();
|
||||
|
||||
Effects.SendLocationParticles( EffectItem.Create( from, fromMap, EffectItem.DefaultDuration ), 0x3728, 1, 13, 37, 7, 5023, 0 );
|
||||
FixedParticles( 0x3728, 1, 13, 5023, 37, 7, EffectLayer.Waist );
|
||||
|
||||
PlaySound( 0x37D );
|
||||
}
|
||||
|
||||
if (m_Target.Hidden && InRange(m_Target, 3) && Core.TickCount - this.NextSkillTime >= 0 && UseSkill(SkillName.DetectHidden))
|
||||
{
|
||||
Target targ = this.Target;
|
||||
|
||||
if ( targ != null )
|
||||
targ.Invoke( this, this );
|
||||
}
|
||||
|
||||
Combatant = m_Target;
|
||||
FocusMob = m_Target;
|
||||
|
||||
if ( AIObject != null )
|
||||
AIObject.Action = ActionType.Combat;
|
||||
|
||||
base.OnThink();
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
Effects.PlaySound( Location, Map, 0x10B );
|
||||
Effects.SendLocationParticles( EffectItem.Create( Location, Map, TimeSpan.FromSeconds( 10.0 ) ), 0x37CC, 1, 50, 2101, 7, 9909, 0 );
|
||||
|
||||
Delete();
|
||||
return false;
|
||||
}
|
||||
|
||||
public Revenant( 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();
|
||||
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
196
Scripts/Mobiles/Monsters/AOS/ShadowKnight.cs
Normal file
196
Scripts/Mobiles/Monsters/AOS/ShadowKnight.cs
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a shadow knight corpse" )]
|
||||
public class ShadowKnight : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return Utility.RandomBool() ? WeaponAbility.ConcussionBlow : WeaponAbility.CrushingBlow;
|
||||
}
|
||||
|
||||
public override bool IgnoreYoungProtection { get { return Core.ML; } }
|
||||
|
||||
[Constructable]
|
||||
public ShadowKnight() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "shadow knight" );
|
||||
Title = "the Shadow Knight";
|
||||
Body = 311;
|
||||
|
||||
SetStr( 250 );
|
||||
SetDex( 100 );
|
||||
SetInt( 100 );
|
||||
|
||||
SetHits( 2000 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Cold, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 90 );
|
||||
SetResistance( ResistanceType.Fire, 65 );
|
||||
SetResistance( ResistanceType.Cold, 75 );
|
||||
SetResistance( ResistanceType.Poison, 75 );
|
||||
SetResistance( ResistanceType.Energy, 55 );
|
||||
|
||||
SetSkill( SkillName.Chivalry, 120.0 );
|
||||
SetSkill( SkillName.DetectHidden, 80.0 );
|
||||
SetSkill( SkillName.EvalInt, 100.0 );
|
||||
SetSkill( SkillName.Magery, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 100.0 );
|
||||
|
||||
Fame = 25000;
|
||||
Karma = -25000;
|
||||
|
||||
VirtualArmor = 54;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
|
||||
DemonKnight.DistributeArtifact( this );
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x2CE;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x2C1;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x2D1;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x2C8;
|
||||
}
|
||||
|
||||
private Timer m_SoundTimer;
|
||||
private bool m_HasTeleportedAway;
|
||||
|
||||
public override void OnCombatantChange()
|
||||
{
|
||||
base.OnCombatantChange();
|
||||
|
||||
if ( Hidden && Combatant != null )
|
||||
Combatant = null;
|
||||
}
|
||||
|
||||
public virtual void SendTrackingSound()
|
||||
{
|
||||
if ( Hidden )
|
||||
{
|
||||
Effects.PlaySound( this.Location, this.Map, 0x2C8 );
|
||||
Combatant = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Frozen = false;
|
||||
|
||||
if ( m_SoundTimer != null )
|
||||
m_SoundTimer.Stop();
|
||||
|
||||
m_SoundTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
if ( !m_HasTeleportedAway && Hits < (HitsMax / 2) )
|
||||
{
|
||||
Map map = this.Map;
|
||||
|
||||
if ( map != null )
|
||||
{
|
||||
// try 10 times to find a teleport spot
|
||||
for ( int i = 0; i < 10; ++i )
|
||||
{
|
||||
int x = X + (Utility.RandomMinMax( 5, 10 ) * (Utility.RandomBool() ? 1 : -1));
|
||||
int y = Y + (Utility.RandomMinMax( 5, 10 ) * (Utility.RandomBool() ? 1 : -1));
|
||||
int z = Z;
|
||||
|
||||
if ( !map.CanFit( x, y, z, 16, false, false ) )
|
||||
continue;
|
||||
|
||||
Point3D from = this.Location;
|
||||
Point3D to = new Point3D( x, y, z );
|
||||
|
||||
if ( !InLOS( to ) )
|
||||
continue;
|
||||
|
||||
this.Location = to;
|
||||
this.ProcessDelta();
|
||||
this.Hidden = true;
|
||||
this.Combatant = null;
|
||||
|
||||
Effects.SendLocationParticles( EffectItem.Create( from, map, EffectItem.DefaultDuration ), 0x3728, 10, 10, 2023 );
|
||||
Effects.SendLocationParticles( EffectItem.Create( to, map, EffectItem.DefaultDuration ), 0x3728, 10, 10, 5023 );
|
||||
|
||||
Effects.PlaySound( to, map, 0x1FE );
|
||||
|
||||
m_HasTeleportedAway = true;
|
||||
m_SoundTimer = Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), TimeSpan.FromSeconds( 2.5 ), new TimerCallback( SendTrackingSound ) );
|
||||
|
||||
Frozen = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
base.OnThink();
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return !Core.SE; } }
|
||||
public override bool Unprovokable{ get{ return Core.SE; } }
|
||||
public override bool AreaPeaceImmune{ get{ return Core.SE; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public ShadowKnight( 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();
|
||||
|
||||
if ( BaseSoundID == 357 )
|
||||
BaseSoundID = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
68
Scripts/Mobiles/Monsters/AOS/SkitteringHopper.cs
Normal file
68
Scripts/Mobiles/Monsters/AOS/SkitteringHopper.cs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a skittering hopper corpse" )]
|
||||
public class SkitteringHopper : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SkitteringHopper() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a skittering hopper";
|
||||
Body = 302;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 41, 65 );
|
||||
SetDex( 91, 115 );
|
||||
SetInt( 26, 50 );
|
||||
|
||||
SetHits( 31, 45 );
|
||||
|
||||
SetDamage( 3, 5 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 5, 10 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 30.1, 45.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 60.0 );
|
||||
|
||||
Fame = 300;
|
||||
Karma = 0;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = -12.9;
|
||||
|
||||
VirtualArmor = 12;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public SkitteringHopper( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
93
Scripts/Mobiles/Monsters/AOS/Treefellow.cs
Normal file
93
Scripts/Mobiles/Monsters/AOS/Treefellow.cs
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a treefellow corpse" )]
|
||||
public class Treefellow : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Treefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a treefellow";
|
||||
Body = 301;
|
||||
|
||||
SetStr( 196, 220 );
|
||||
SetDex( 31, 55 );
|
||||
SetInt( 66, 90 );
|
||||
|
||||
SetHits( 118, 132 );
|
||||
|
||||
SetDamage( 12, 16 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 25 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 30, 35 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
|
||||
SetSkill( SkillName.Tactics, 65.1, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 65.1, 85.0 );
|
||||
|
||||
Fame = 500;
|
||||
Karma = 1500;
|
||||
|
||||
VirtualArmor = 24;
|
||||
PackItem( new Log( Utility.RandomMinMax( 23, 34 ) ) );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 443;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 31;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 672;
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public Treefellow( 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();
|
||||
|
||||
if ( BaseSoundID == 442 )
|
||||
BaseSoundID = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
70
Scripts/Mobiles/Monsters/AOS/VampireBat.cs
Normal file
70
Scripts/Mobiles/Monsters/AOS/VampireBat.cs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a vampire bat corpse" )]
|
||||
public class VampireBat : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public VampireBat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a vampire bat";
|
||||
Body = 317;
|
||||
BaseSoundID = 0x270;
|
||||
|
||||
SetStr( 91, 110 );
|
||||
SetDex( 91, 115 );
|
||||
SetInt( 26, 50 );
|
||||
|
||||
SetHits( 55, 66 );
|
||||
|
||||
SetDamage( 7, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 15, 25 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 60, 70 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 55.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 30.1, 55.0 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
VirtualArmor = 14;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x29B;
|
||||
}
|
||||
|
||||
public VampireBat( 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/AOS/WailingBanshee.cs
Normal file
73
Scripts/Mobiles/Monsters/AOS/WailingBanshee.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a wailing banshee corpse" )]
|
||||
public class WailingBanshee : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.MortalStrike;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public WailingBanshee() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a wailing banshee";
|
||||
Body = 310;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 126, 150 );
|
||||
SetDex( 76, 100 );
|
||||
SetInt( 86, 110 );
|
||||
|
||||
SetHits( 76, 90 );
|
||||
|
||||
SetDamage( 10, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 70, 80 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
|
||||
|
||||
Fame = 1500;
|
||||
Karma = -1500;
|
||||
|
||||
VirtualArmor = 19;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public WailingBanshee( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/AOS/WandererOfTheVoid.cs
Normal file
78
Scripts/Mobiles/Monsters/AOS/WandererOfTheVoid.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a wanderer of the void corpse" )]
|
||||
public class WandererOfTheVoid : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public WandererOfTheVoid() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a wanderer of the void";
|
||||
Body = 316;
|
||||
BaseSoundID = 377;
|
||||
|
||||
SetStr( 111, 200 );
|
||||
SetDex( 101, 125 );
|
||||
SetInt( 301, 390 );
|
||||
|
||||
SetHits( 351, 400 );
|
||||
|
||||
SetDamage( 11, 13 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Cold, 15 );
|
||||
SetDamageType( ResistanceType.Energy, 85 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 15, 25 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 75 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 70.0 );
|
||||
SetSkill( SkillName.Meditation, 60.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 60.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
|
||||
|
||||
Fame = 20000;
|
||||
Karma = -20000;
|
||||
|
||||
VirtualArmor = 44;
|
||||
|
||||
int count = Utility.RandomMinMax( 2, 3 );
|
||||
|
||||
for ( int i = 0; i < count; ++i )
|
||||
PackItem( new TreasureMap( 3, Map.Trammel ) );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 1; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
public WandererOfTheVoid( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
113
Scripts/Mobiles/Monsters/Ants/AntLion.cs
Normal file
113
Scripts/Mobiles/Monsters/Ants/AntLion.cs
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an ant lion corpse" )]
|
||||
public class AntLion : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public AntLion() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an ant lion";
|
||||
Body = 787;
|
||||
BaseSoundID = 1006;
|
||||
|
||||
SetStr( 296, 320 );
|
||||
SetDex( 81, 105 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 151, 162 );
|
||||
|
||||
SetDamage( 7, 21 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 70 );
|
||||
SetDamageType( ResistanceType.Poison, 30 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 60 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 30, 35 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 45;
|
||||
|
||||
PackItem( new Bone( 3 ) );
|
||||
PackItem( new FertileDirt( Utility.RandomMinMax( 1, 5 ) ) );
|
||||
|
||||
if ( Core.ML && Utility.RandomDouble() < .33 )
|
||||
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(2) );
|
||||
|
||||
Item orepile = null; /* no trust, no love :( */
|
||||
|
||||
switch (Utility.Random(4))
|
||||
{
|
||||
case 0: orepile = new DullCopperOre(); break;
|
||||
case 1: orepile = new ShadowIronOre(); break;
|
||||
case 2: orepile = new CopperOre(); break;
|
||||
default: orepile = new BronzeOre(); break;
|
||||
}
|
||||
orepile.Amount = Utility.RandomMinMax(1, 10);
|
||||
orepile.ItemID = 0x19B9;
|
||||
PackItem(orepile);
|
||||
|
||||
// TODO: skeleton
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x5A;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x5A;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x164;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x187;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x1BA;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
}
|
||||
|
||||
|
||||
public AntLion( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
111
Scripts/Mobiles/Monsters/Ants/BlackSolenInfiltratorQueen.cs
Normal file
111
Scripts/Mobiles/Monsters/Ants/BlackSolenInfiltratorQueen.cs
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen infiltrator corpse" )] // TODO: Corpse name?
|
||||
public class BlackSolenInfiltratorQueen : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BlackSolenInfiltratorQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a black solen infiltrator";
|
||||
Body = 807;
|
||||
BaseSoundID = 959;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 326, 350 );
|
||||
SetDex( 141, 165 );
|
||||
SetInt( 96, 120 );
|
||||
|
||||
SetHits( 151, 162 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 70 );
|
||||
SetDamageType( ResistanceType.Poison, 30 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 30, 35 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 90.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0 );
|
||||
|
||||
Fame = 6500;
|
||||
Karma = -6500;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() ) ? 16 : 4 ) );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x195;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x250;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x25B;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckBlackFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnBlackDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public BlackSolenInfiltratorQueen( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
112
Scripts/Mobiles/Monsters/Ants/BlackSolenInfiltratorWarrior.cs
Normal file
112
Scripts/Mobiles/Monsters/Ants/BlackSolenInfiltratorWarrior.cs
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen infiltrator corpse" )]
|
||||
public class BlackSolenInfiltratorWarrior : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BlackSolenInfiltratorWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a black solen infiltrator";
|
||||
Body = 806;
|
||||
BaseSoundID = 959;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 206, 230 );
|
||||
SetDex( 121, 145 );
|
||||
SetInt( 66, 90 );
|
||||
|
||||
SetHits( 96, 107 );
|
||||
|
||||
SetDamage( 5, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 35 );
|
||||
SetResistance( ResistanceType.Cold, 10, 25 );
|
||||
SetResistance( ResistanceType.Poison, 20, 35 );
|
||||
SetResistance( ResistanceType.Energy, 10, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() )? 13 : 3 ) );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x289;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0xBC;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0xE4;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckBlackFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnBlackDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public BlackSolenInfiltratorWarrior( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
150
Scripts/Mobiles/Monsters/Ants/BlackSolenQueen.cs
Normal file
150
Scripts/Mobiles/Monsters/Ants/BlackSolenQueen.cs
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen queen corpse" )]
|
||||
public class BlackSolenQueen : BaseCreature
|
||||
{
|
||||
private bool m_BurstSac;
|
||||
public bool BurstSac{ get{ return m_BurstSac; } }
|
||||
|
||||
[Constructable]
|
||||
public BlackSolenQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a black solen queen";
|
||||
Body = 807;
|
||||
BaseSoundID = 959;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 296, 320 );
|
||||
SetDex( 121, 145 );
|
||||
SetInt( 76, 100 );
|
||||
|
||||
SetHits( 151, 162 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 70 );
|
||||
SetDamageType( ResistanceType.Poison, 30 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 30, 35 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 45;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( Utility.RandomDouble() > 0.05 )? 5 : 25 ) );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
PackItem( new BallOfSummoning() );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x195;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x250;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x25B;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckBlackFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnBlackDamage( from );
|
||||
|
||||
if ( !willKill )
|
||||
{
|
||||
if ( !BurstSac )
|
||||
{
|
||||
if ( Hits < 50 )
|
||||
{
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
|
||||
m_BurstSac = true;
|
||||
}
|
||||
}
|
||||
else if ( from != null && from != this && InRange( from, 1 ) )
|
||||
{
|
||||
SpillAcid( from, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
SpillAcid( 4 );
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public BlackSolenQueen( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 1 );
|
||||
writer.Write( m_BurstSac );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch( version )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
m_BurstSac = reader.ReadBool();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
151
Scripts/Mobiles/Monsters/Ants/BlackSolenWarrior.cs
Normal file
151
Scripts/Mobiles/Monsters/Ants/BlackSolenWarrior.cs
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen warrior corpse" )]
|
||||
public class BlackSolenWarrior : BaseCreature
|
||||
{
|
||||
private bool m_BurstSac;
|
||||
public bool BurstSac{ get{ return m_BurstSac; } }
|
||||
|
||||
[Constructable]
|
||||
public BlackSolenWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a black solen warrior";
|
||||
Body = 806;
|
||||
BaseSoundID = 959;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 196, 220 );
|
||||
SetDex( 101, 125 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 96, 107 );
|
||||
|
||||
SetDamage( 5, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 35 );
|
||||
SetResistance( ResistanceType.Cold, 10, 25 );
|
||||
SetResistance( ResistanceType.Poison, 20, 35 );
|
||||
SetResistance( ResistanceType.Energy, 10, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 35;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() )? 13 : 3 ) );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
PackItem( new BraceletOfBinding() );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x289;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0xBC;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0xE4;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckBlackFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnBlackDamage( from );
|
||||
|
||||
if ( !willKill )
|
||||
{
|
||||
if ( !BurstSac )
|
||||
{
|
||||
if ( Hits < 50 )
|
||||
{
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
|
||||
m_BurstSac = true;
|
||||
}
|
||||
}
|
||||
else if ( from != null && from != this && InRange( from, 1 ) )
|
||||
{
|
||||
SpillAcid( from, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
SpillAcid( 4 );
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public BlackSolenWarrior( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 1 );
|
||||
writer.Write( m_BurstSac );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch( version )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
m_BurstSac = reader.ReadBool();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
112
Scripts/Mobiles/Monsters/Ants/BlackSolenWorker.cs
Normal file
112
Scripts/Mobiles/Monsters/Ants/BlackSolenWorker.cs
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen worker corpse" )]
|
||||
public class BlackSolenWorker : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BlackSolenWorker() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a black solen worker";
|
||||
Body = 805;
|
||||
BaseSoundID = 959;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 96, 120 );
|
||||
SetDex( 81, 105 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 58, 72 );
|
||||
|
||||
SetDamage( 5, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 65.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.0 );
|
||||
|
||||
Fame = 1500;
|
||||
Karma = -1500;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackGold( Utility.Random( 100, 180 ) );
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus() );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x269;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x269;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x186;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x1BE;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x8E;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 2 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckBlackFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnBlackDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public BlackSolenWorker( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
110
Scripts/Mobiles/Monsters/Ants/RedSolenInfiltratorQueen.cs
Normal file
110
Scripts/Mobiles/Monsters/Ants/RedSolenInfiltratorQueen.cs
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen infiltrator corpse" )] // TODO: Corpse name?
|
||||
public class RedSolenInfiltratorQueen : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public RedSolenInfiltratorQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a red solen infiltrator";
|
||||
Body = 783;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 326, 350 );
|
||||
SetDex( 141, 165 );
|
||||
SetInt( 96, 120 );
|
||||
|
||||
SetHits( 151, 162 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 70 );
|
||||
SetDamageType( ResistanceType.Poison, 30 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 30, 35 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 90.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0 );
|
||||
|
||||
Fame = 6500;
|
||||
Karma = -6500;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 4 : 16 ) );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x195;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x250;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x25B;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckRedFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnRedDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public RedSolenInfiltratorQueen( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
112
Scripts/Mobiles/Monsters/Ants/RedSolenInfiltratorWarrior.cs
Normal file
112
Scripts/Mobiles/Monsters/Ants/RedSolenInfiltratorWarrior.cs
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen infiltrator corpse" )]
|
||||
public class RedSolenInfiltratorWarrior : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public RedSolenInfiltratorWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a red solen infiltrator";
|
||||
Body = 782;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 206, 230 );
|
||||
SetDex( 121, 145 );
|
||||
SetInt( 66, 90 );
|
||||
|
||||
SetHits( 96, 107 );
|
||||
|
||||
SetDamage( 5, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 35 );
|
||||
SetResistance( ResistanceType.Cold, 10, 25 );
|
||||
SetResistance( ResistanceType.Poison, 20, 35 );
|
||||
SetResistance( ResistanceType.Energy, 10, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 3 : 13 ) );
|
||||
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x289;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0xBC;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0xE4;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckRedFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnRedDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public RedSolenInfiltratorWarrior( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
150
Scripts/Mobiles/Monsters/Ants/RedSolenQueen.cs
Normal file
150
Scripts/Mobiles/Monsters/Ants/RedSolenQueen.cs
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen queen corpse" )]
|
||||
public class RedSolenQueen : BaseCreature
|
||||
{
|
||||
private bool m_BurstSac;
|
||||
public bool BurstSac{ get{ return m_BurstSac; } }
|
||||
|
||||
[Constructable]
|
||||
public RedSolenQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a red solen queen";
|
||||
Body = 783;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 296, 320 );
|
||||
SetDex( 121, 145 );
|
||||
SetInt( 76, 100 );
|
||||
|
||||
SetHits( 151, 162 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 70 );
|
||||
SetDamageType( ResistanceType.Poison, 30 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 30, 35 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 45;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus( ( Utility.RandomDouble() > 0.05 )? 5 : 25 ) );
|
||||
|
||||
if( Utility.RandomDouble() < 0.05 )
|
||||
PackItem( new BallOfSummoning() );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x259;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x195;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x250;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x25B;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckRedFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnRedDamage( from );
|
||||
|
||||
if ( !willKill )
|
||||
{
|
||||
if ( !BurstSac )
|
||||
{
|
||||
if ( Hits < 50 )
|
||||
{
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
|
||||
m_BurstSac = true;
|
||||
}
|
||||
}
|
||||
else if ( from != null && from != this && InRange( from, 1 ) )
|
||||
{
|
||||
SpillAcid( from, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
SpillAcid( 4 );
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public RedSolenQueen( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 1 );
|
||||
writer.Write( m_BurstSac );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch( version )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
m_BurstSac = reader.ReadBool();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
150
Scripts/Mobiles/Monsters/Ants/RedSolenWarrior.cs
Normal file
150
Scripts/Mobiles/Monsters/Ants/RedSolenWarrior.cs
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen warrior corpse" )]
|
||||
public class RedSolenWarrior : BaseCreature
|
||||
{
|
||||
private bool m_BurstSac;
|
||||
public bool BurstSac{ get{ return m_BurstSac; } }
|
||||
|
||||
[Constructable]
|
||||
public RedSolenWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a red solen warrior";
|
||||
Body = 782;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 196, 220 );
|
||||
SetDex( 101, 125 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 96, 107 );
|
||||
|
||||
SetDamage( 5, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 35 );
|
||||
SetResistance( ResistanceType.Cold, 10, 25 );
|
||||
SetResistance( ResistanceType.Poison, 20, 35 );
|
||||
SetResistance( ResistanceType.Energy, 10, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 35;
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 3 : 13 ) );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
PackItem( new BraceletOfBinding() );
|
||||
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0xB5;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x289;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0xBC;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0xE4;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckRedFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnRedDamage( from );
|
||||
|
||||
if ( !willKill )
|
||||
{
|
||||
if ( !BurstSac )
|
||||
{
|
||||
if ( Hits < 50 )
|
||||
{
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
|
||||
m_BurstSac = true;
|
||||
}
|
||||
}
|
||||
else if ( from != null && from != this && InRange( from, 1 ) )
|
||||
{
|
||||
SpillAcid( from, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
SpillAcid( 4 );
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public RedSolenWarrior( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 1 );
|
||||
writer.Write( m_BurstSac );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch( version )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
m_BurstSac = reader.ReadBool();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
111
Scripts/Mobiles/Monsters/Ants/RedSolenWorker.cs
Normal file
111
Scripts/Mobiles/Monsters/Ants/RedSolenWorker.cs
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a solen worker corpse" )]
|
||||
public class RedSolenWorker : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public RedSolenWorker() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a red solen worker";
|
||||
Body = 781;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr( 96, 120 );
|
||||
SetDex( 81, 105 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 58, 72 );
|
||||
|
||||
SetDamage( 5, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 65.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.0 );
|
||||
|
||||
Fame = 1500;
|
||||
Karma = -1500;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackGold( Utility.Random( 100, 180 ) );
|
||||
|
||||
SolenHelper.PackPicnicBasket( this );
|
||||
|
||||
PackItem( new ZoogiFungus() );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x269;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x269;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x186;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x1BE;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x8E;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 2 ) );
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( SolenHelper.CheckRedFriendship( m ) )
|
||||
return false;
|
||||
else
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
SolenHelper.OnRedDamage( from );
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public RedSolenWorker( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
101
Scripts/Mobiles/Monsters/Ants/SolenHelper.cs
Normal file
101
Scripts/Mobiles/Monsters/Ants/SolenHelper.cs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class SolenHelper
|
||||
{
|
||||
public static void PackPicnicBasket( BaseCreature solen )
|
||||
{
|
||||
if ( 1 > Utility.Random( 100 ) )
|
||||
{
|
||||
PicnicBasket basket = new PicnicBasket();
|
||||
|
||||
basket.DropItem( new BeverageBottle( BeverageType.Wine ) );
|
||||
basket.DropItem( new CheeseWedge() );
|
||||
|
||||
solen.PackItem( basket );
|
||||
}
|
||||
}
|
||||
|
||||
public static bool CheckRedFriendship( Mobile m )
|
||||
{
|
||||
if ( m is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)m;
|
||||
|
||||
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
|
||||
return CheckRedFriendship( bc.ControlMaster );
|
||||
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
|
||||
return CheckRedFriendship( bc.SummonMaster );
|
||||
}
|
||||
|
||||
PlayerMobile player = m as PlayerMobile;
|
||||
|
||||
return player != null && player.SolenFriendship == SolenFriendship.Red;
|
||||
}
|
||||
|
||||
public static bool CheckBlackFriendship( Mobile m )
|
||||
{
|
||||
if ( m is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)m;
|
||||
|
||||
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
|
||||
return CheckBlackFriendship( bc.ControlMaster );
|
||||
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
|
||||
return CheckBlackFriendship( bc.SummonMaster );
|
||||
}
|
||||
|
||||
PlayerMobile player = m as PlayerMobile;
|
||||
|
||||
return player != null && player.SolenFriendship == SolenFriendship.Black;
|
||||
}
|
||||
|
||||
public static void OnRedDamage( Mobile from )
|
||||
{
|
||||
if ( from is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)from;
|
||||
|
||||
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
|
||||
OnRedDamage( bc.ControlMaster );
|
||||
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
|
||||
OnRedDamage( bc.SummonMaster );
|
||||
}
|
||||
|
||||
PlayerMobile player = from as PlayerMobile;
|
||||
|
||||
if ( player != null && player.SolenFriendship == SolenFriendship.Red )
|
||||
{
|
||||
player.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1054103 ); // The solen revoke their friendship. You will now be considered an intruder.
|
||||
|
||||
player.SolenFriendship = SolenFriendship.None;
|
||||
}
|
||||
}
|
||||
|
||||
public static void OnBlackDamage( Mobile from )
|
||||
{
|
||||
if ( from is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)from;
|
||||
|
||||
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
|
||||
OnBlackDamage( bc.ControlMaster );
|
||||
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
|
||||
OnBlackDamage( bc.SummonMaster );
|
||||
}
|
||||
|
||||
PlayerMobile player = from as PlayerMobile;
|
||||
|
||||
if ( player != null && player.SolenFriendship == SolenFriendship.Black )
|
||||
{
|
||||
player.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1054103 ); // The solen revoke their friendship. You will now be considered an intruder.
|
||||
|
||||
player.SolenFriendship = SolenFriendship.None;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/Arachnid/Magic/DreadSpider.cs
Normal file
77
Scripts/Mobiles/Monsters/Arachnid/Magic/DreadSpider.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a dread spider corpse" )]
|
||||
public class DreadSpider : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DreadSpider () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a dread spider";
|
||||
Body = 11;
|
||||
BaseSoundID = 1170;
|
||||
|
||||
SetStr( 196, 220 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 286, 310 );
|
||||
|
||||
SetHits( 118, 132 );
|
||||
|
||||
SetDamage( 5, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 90, 100 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Meditation, 65.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 75.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 36;
|
||||
|
||||
PackItem( new SpidersSilk( 8 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
|
||||
public DreadSpider( 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();
|
||||
|
||||
if ( BaseSoundID == 263 )
|
||||
BaseSoundID = 1170;
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Scripts/Mobiles/Monsters/Arachnid/Magic/TerathanAvenger.cs
Normal file
82
Scripts/Mobiles/Monsters/Arachnid/Magic/TerathanAvenger.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a terathan avenger corpse" )]
|
||||
public class TerathanAvenger : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public TerathanAvenger() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a terathan avenger";
|
||||
Body = 152;
|
||||
BaseSoundID = 0x24D;
|
||||
|
||||
SetStr( 467, 645 );
|
||||
SetDex( 77, 95 );
|
||||
SetInt( 126, 150 );
|
||||
|
||||
SetHits( 296, 372 );
|
||||
SetMana( 46, 70 );
|
||||
|
||||
SetDamage( 18, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 35, 45 );
|
||||
SetResistance( ResistanceType.Poison, 90, 100 );
|
||||
SetResistance( ResistanceType.Energy, 35, 45 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.3, 100.0 );
|
||||
SetSkill( SkillName.Magery, 70.3, 100.0 );
|
||||
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich, 2 );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Deadly; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
public override int Meat{ get{ return 2; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.TerathansAndOphidians; }
|
||||
}
|
||||
|
||||
public TerathanAvenger( 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();
|
||||
|
||||
if ( BaseSoundID == 263 )
|
||||
BaseSoundID = 0x24D;
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/Arachnid/Magic/TerathanMatriarch.cs
Normal file
77
Scripts/Mobiles/Monsters/Arachnid/Magic/TerathanMatriarch.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a terathan matriarch corpse" )]
|
||||
public class TerathanMatriarch : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public TerathanMatriarch() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a terathan matriarch";
|
||||
Body = 72;
|
||||
BaseSoundID = 599;
|
||||
|
||||
SetStr( 316, 405 );
|
||||
SetDex( 96, 115 );
|
||||
SetInt( 366, 455 );
|
||||
|
||||
SetHits( 190, 243 );
|
||||
|
||||
SetDamage( 11, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 35, 45 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 35, 45 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
PackItem( new SpidersSilk( 5 ) );
|
||||
PackNecroReg( Utility.RandomMinMax( 4, 10 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 4; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.TerathansAndOphidians; }
|
||||
}
|
||||
|
||||
public TerathanMatriarch( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/Arachnid/Melee/FrostSpider.cs
Normal file
78
Scripts/Mobiles/Monsters/Arachnid/Melee/FrostSpider.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a frost spider corpse" )]
|
||||
public class FrostSpider : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public FrostSpider() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a frost spider";
|
||||
Body = 20;
|
||||
BaseSoundID = 0x388;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 6, 16 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Fire, 5, 10 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 25.1, 40.0 );
|
||||
SetSkill( SkillName.Tactics, 35.1, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 65.0 );
|
||||
|
||||
Fame = 775;
|
||||
Karma = -775;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = 74.7;
|
||||
|
||||
PackItem( new SpidersSilk( 7 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Poor );
|
||||
}
|
||||
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override PackInstinct PackInstinct{ get{ return PackInstinct.Arachnid; } }
|
||||
|
||||
public FrostSpider( 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();
|
||||
|
||||
if ( BaseSoundID == 387 )
|
||||
BaseSoundID = 0x388;
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Arachnid/Melee/GiantBlackWidow.cs
Normal file
75
Scripts/Mobiles/Monsters/Arachnid/Melee/GiantBlackWidow.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a giant black widow spider corpse" )] // stupid corpse name
|
||||
public class GiantBlackWidow : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GiantBlackWidow() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a giant black widow";
|
||||
Body = 0x9D;
|
||||
BaseSoundID = 0x388; // TODO: validate
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 96, 115 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 5, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 30 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 30.3, 75.0 );
|
||||
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.1, 85.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 24;
|
||||
|
||||
PackItem( new SpidersSilk( 5 ) );
|
||||
PackItem( new LesserPoisonPotion() );
|
||||
PackItem( new LesserPoisonPotion() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Deadly; } }
|
||||
|
||||
public GiantBlackWidow( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Arachnid/Melee/GiantSpider.cs
Normal file
75
Scripts/Mobiles/Monsters/Arachnid/Melee/GiantSpider.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a giant spider corpse" )]
|
||||
public class GiantSpider : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GiantSpider() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a giant spider";
|
||||
Body = 28;
|
||||
BaseSoundID = 0x388;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 5, 13 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 20 );
|
||||
SetResistance( ResistanceType.Poison, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 25.1, 40.0 );
|
||||
SetSkill( SkillName.Tactics, 35.1, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 65.0 );
|
||||
|
||||
Fame = 600;
|
||||
Karma = -600;
|
||||
|
||||
VirtualArmor = 16;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = 59.1;
|
||||
|
||||
PackItem( new SpidersSilk( 5 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
}
|
||||
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override PackInstinct PackInstinct{ get{ return PackInstinct.Arachnid; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Regular; } }
|
||||
|
||||
public GiantSpider( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
80
Scripts/Mobiles/Monsters/Arachnid/Melee/TerathanDrone.cs
Normal file
80
Scripts/Mobiles/Monsters/Arachnid/Melee/TerathanDrone.cs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a terathan drone corpse" )]
|
||||
public class TerathanDrone : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public TerathanDrone() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a terathan drone";
|
||||
Body = 71;
|
||||
BaseSoundID = 594;
|
||||
|
||||
SetStr( 36, 65 );
|
||||
SetDex( 96, 145 );
|
||||
SetInt( 21, 45 );
|
||||
|
||||
SetHits( 22, 39 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 6, 12 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 25 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 40.1, 60.0 );
|
||||
SetSkill( SkillName.MagicResist, 30.1, 45.0 );
|
||||
SetSkill( SkillName.Tactics, 30.1, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
|
||||
|
||||
Fame = 2000;
|
||||
Karma = -2000;
|
||||
|
||||
VirtualArmor = 24;
|
||||
|
||||
PackItem( new SpidersSilk( 2 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
// TODO: weapon?
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 4; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.TerathansAndOphidians; }
|
||||
}
|
||||
|
||||
public TerathanDrone( 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();
|
||||
|
||||
if ( BaseSoundID == 589 )
|
||||
BaseSoundID = 594;
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/Arachnid/Melee/TerathanWarrior.cs
Normal file
78
Scripts/Mobiles/Monsters/Arachnid/Melee/TerathanWarrior.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a terathan warrior corpse" )]
|
||||
public class TerathanWarrior : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public TerathanWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a terathan warrior";
|
||||
Body = 70;
|
||||
BaseSoundID = 589;
|
||||
|
||||
SetStr( 166, 215 );
|
||||
SetDex( 96, 145 );
|
||||
SetInt( 41, 65 );
|
||||
|
||||
SetHits( 100, 129 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 7, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 30;
|
||||
|
||||
if ( Core.ML && Utility.RandomDouble() < .33 )
|
||||
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(3) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 4; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.TerathansAndOphidians; }
|
||||
}
|
||||
|
||||
public TerathanWarrior( 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/Elemental/Magic/AcidElemental.cs
Normal file
87
Scripts/Mobiles/Monsters/Elemental/Magic/AcidElemental.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[TypeAlias( "Server.Mobiles.ToxicElemental" )]
|
||||
[CorpseName( "an acid elemental corpse" )]
|
||||
public class AcidElemental : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public AcidElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an acid elemental";
|
||||
Body = 0x9E;
|
||||
BaseSoundID = 278;
|
||||
|
||||
SetStr( 326, 355 );
|
||||
SetDex( 66, 85 );
|
||||
SetInt( 271, 295 );
|
||||
|
||||
SetHits( 196, 213 );
|
||||
|
||||
SetDamage( 9, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 25 );
|
||||
SetDamageType( ResistanceType.Fire, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 30.3, 60.0 );
|
||||
SetSkill( SkillName.EvalInt, 70.1, 85.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 85.0 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Lethal; } }
|
||||
public override double HitPoisonChance{ get{ return 0.6; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 2 : 3; } }
|
||||
|
||||
public AcidElemental( 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();
|
||||
|
||||
if ( BaseSoundID == 263 )
|
||||
BaseSoundID = 278;
|
||||
|
||||
if ( Body == 13 )
|
||||
Body = 0x9E;
|
||||
|
||||
if ( Hue == 0x4001 )
|
||||
Hue = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Scripts/Mobiles/Monsters/Elemental/Magic/AirElemental.cs
Normal file
82
Scripts/Mobiles/Monsters/Elemental/Magic/AirElemental.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an air elemental corpse" )]
|
||||
public class AirElemental : BaseCreature
|
||||
{
|
||||
public override double DispelDifficulty{ get{ return 117.5; } }
|
||||
public override double DispelFocus{ get{ return 45.0; } }
|
||||
|
||||
[Constructable]
|
||||
public AirElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an air elemental";
|
||||
Body = 13;
|
||||
Hue = 0x4001;
|
||||
BaseSoundID = 655;
|
||||
|
||||
SetStr( 126, 155 );
|
||||
SetDex( 166, 185 );
|
||||
SetInt( 101, 125 );
|
||||
|
||||
SetHits( 76, 93 );
|
||||
|
||||
SetDamage( 8, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 40 );
|
||||
SetDamageType( ResistanceType.Energy, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 15, 25 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 75.0 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 60.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 40;
|
||||
ControlSlots = 2;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.LowScrolls );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 2; } }
|
||||
|
||||
public AirElemental( 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();
|
||||
|
||||
if ( BaseSoundID == 263 )
|
||||
BaseSoundID = 655;
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/Elemental/Magic/BloodElemental.cs
Normal file
72
Scripts/Mobiles/Monsters/Elemental/Magic/BloodElemental.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a blood elemental corpse" )]
|
||||
public class BloodElemental : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BloodElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a blood elemental";
|
||||
Body = 159;
|
||||
BaseSoundID = 278;
|
||||
|
||||
SetStr( 526, 615 );
|
||||
SetDex( 66, 85 );
|
||||
SetInt( 226, 350 );
|
||||
|
||||
SetHits( 316, 369 );
|
||||
|
||||
SetDamage( 17, 27 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 85.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 85.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 10.4, 50.0 );
|
||||
SetSkill( SkillName.MagicResist, 80.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
Fame = 12500;
|
||||
Karma = -12500;
|
||||
|
||||
VirtualArmor = 60;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public BloodElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Scripts/Mobiles/Monsters/Elemental/Magic/Efreet.cs
Normal file
83
Scripts/Mobiles/Monsters/Elemental/Magic/Efreet.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an efreet corpse" )]
|
||||
public class Efreet : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Efreet () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an efreet";
|
||||
Body = 131;
|
||||
BaseSoundID = 768;
|
||||
|
||||
SetStr( 326, 355 );
|
||||
SetDex( 266, 285 );
|
||||
SetInt( 171, 195 );
|
||||
|
||||
SetHits( 196, 213 );
|
||||
|
||||
SetDamage( 11, 13 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Fire, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 75.0 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 60.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
VirtualArmor = 56;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Gems );
|
||||
|
||||
if ( 0.02 > Utility.RandomDouble() )
|
||||
{
|
||||
switch ( Utility.Random( 5 ) )
|
||||
{
|
||||
case 0: PackItem( new DaemonArms() ); break;
|
||||
case 1: PackItem( new DaemonChest() ); break;
|
||||
case 2: PackItem( new DaemonGloves() ); break;
|
||||
case 3: PackItem( new DaemonLegs() ); break;
|
||||
case 4: PackItem( new DaemonHelm() ); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 5; } }
|
||||
|
||||
public Efreet( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Scripts/Mobiles/Monsters/Elemental/Magic/FireElemental.cs
Normal file
83
Scripts/Mobiles/Monsters/Elemental/Magic/FireElemental.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a fire elemental corpse" )]
|
||||
public class FireElemental : BaseCreature
|
||||
{
|
||||
public override double DispelDifficulty{ get{ return 117.5; } }
|
||||
public override double DispelFocus{ get{ return 45.0; } }
|
||||
|
||||
[Constructable]
|
||||
public FireElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a fire elemental";
|
||||
Body = 15;
|
||||
BaseSoundID = 838;
|
||||
|
||||
SetStr( 126, 155 );
|
||||
SetDex( 166, 185 );
|
||||
SetInt( 101, 125 );
|
||||
|
||||
SetHits( 76, 93 );
|
||||
|
||||
SetDamage( 7, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 25 );
|
||||
SetDamageType( ResistanceType.Fire, 75 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 60, 80 );
|
||||
SetResistance( ResistanceType.Cold, 5, 10 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 75.0 );
|
||||
SetSkill( SkillName.MagicResist, 75.2, 105.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.1, 100.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 40;
|
||||
ControlSlots = 4;
|
||||
|
||||
PackItem( new SulfurousAsh( 3 ) );
|
||||
|
||||
AddItem( new LightSource() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 2; } }
|
||||
|
||||
public FireElemental( 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();
|
||||
|
||||
if ( BaseSoundID == 274 )
|
||||
BaseSoundID = 838;
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/Elemental/Magic/IceElemental.cs
Normal file
72
Scripts/Mobiles/Monsters/Elemental/Magic/IceElemental.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an ice elemental corpse" )]
|
||||
public class IceElemental : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public IceElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an ice elemental";
|
||||
Body = 161;
|
||||
BaseSoundID = 268;
|
||||
|
||||
SetStr( 156, 185 );
|
||||
SetDex( 96, 115 );
|
||||
SetInt( 171, 192 );
|
||||
|
||||
SetHits( 94, 111 );
|
||||
|
||||
SetDamage( 10, 21 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 25 );
|
||||
SetDamageType( ResistanceType.Cold, 75 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 5, 10 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 10.5, 60.0 );
|
||||
SetSkill( SkillName.Magery, 10.5, 60.0 );
|
||||
SetSkill( SkillName.MagicResist, 30.1, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 100.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
PackItem( new BlackPearl() );
|
||||
PackReg( 3 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.Gems, 2 );
|
||||
}
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public IceElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Scripts/Mobiles/Monsters/Elemental/Magic/PoisonElemental.cs
Normal file
82
Scripts/Mobiles/Monsters/Elemental/Magic/PoisonElemental.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a poison elementals corpse" )]
|
||||
public class PoisonElemental : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public PoisonElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a poison elemental";
|
||||
Body = 162;
|
||||
BaseSoundID = 263;
|
||||
|
||||
SetStr( 426, 515 );
|
||||
SetDex( 166, 185 );
|
||||
SetInt( 361, 435 );
|
||||
|
||||
SetHits( 256, 309 );
|
||||
|
||||
SetDamage( 12, 18 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 10 );
|
||||
SetDamageType( ResistanceType.Poison, 90 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 70 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 80.1, 95.0 );
|
||||
SetSkill( SkillName.Magery, 80.1, 95.0 );
|
||||
SetSkill( SkillName.Meditation, 80.2, 120.0 );
|
||||
SetSkill( SkillName.Poisoning, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 85.2, 115.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
|
||||
|
||||
Fame = 12500;
|
||||
Karma = -12500;
|
||||
|
||||
VirtualArmor = 70;
|
||||
|
||||
PackItem( new Nightshade( 4 ) );
|
||||
PackItem( new LesserPoisonPotion() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override Poison HitPoison{ get{ return Poison.Lethal; } }
|
||||
public override double HitPoisonChance{ get{ return 0.75; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public PoisonElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/Elemental/Magic/WaterElemental.cs
Normal file
78
Scripts/Mobiles/Monsters/Elemental/Magic/WaterElemental.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a water elemental corpse" )]
|
||||
public class WaterElemental : BaseCreature
|
||||
{
|
||||
public override double DispelDifficulty{ get{ return 117.5; } }
|
||||
public override double DispelFocus{ get{ return 45.0; } }
|
||||
|
||||
[Constructable]
|
||||
public WaterElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a water elemental";
|
||||
Body = 16;
|
||||
BaseSoundID = 278;
|
||||
|
||||
SetStr( 126, 155 );
|
||||
SetDex( 66, 85 );
|
||||
SetInt( 101, 125 );
|
||||
|
||||
SetHits( 76, 93 );
|
||||
|
||||
SetDamage( 7, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 10, 25 );
|
||||
SetResistance( ResistanceType.Cold, 10, 25 );
|
||||
SetResistance( ResistanceType.Poison, 60, 70 );
|
||||
SetResistance( ResistanceType.Energy, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 75.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.1, 115.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 40;
|
||||
ControlSlots = 3;
|
||||
CanSwim = true;
|
||||
|
||||
PackItem( new BlackPearl( 3 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 2; } }
|
||||
|
||||
public WaterElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Scripts/Mobiles/Monsters/Elemental/Melee/EarthElemental.cs
Normal file
81
Scripts/Mobiles/Monsters/Elemental/Melee/EarthElemental.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an earth elemental corpse" )]
|
||||
public class EarthElemental : BaseCreature
|
||||
{
|
||||
public override double DispelDifficulty{ get{ return 117.5; } }
|
||||
public override double DispelFocus{ get{ return 45.0; } }
|
||||
|
||||
[Constructable]
|
||||
public EarthElemental() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an earth elemental";
|
||||
Body = 14;
|
||||
BaseSoundID = 268;
|
||||
|
||||
SetStr( 126, 155 );
|
||||
SetDex( 66, 85 );
|
||||
SetInt( 71, 92 );
|
||||
|
||||
SetHits( 76, 93 );
|
||||
|
||||
SetDamage( 9, 16 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 15, 25 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 50.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 60.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 100.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 34;
|
||||
ControlSlots = 2;
|
||||
|
||||
PackItem( new FertileDirt( Utility.RandomMinMax( 1, 4 ) ) );
|
||||
PackItem( new MandrakeRoot() );
|
||||
|
||||
Item ore = new IronOre( 5 );
|
||||
ore.ItemID = 0x19B7;
|
||||
PackItem( ore );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public EarthElemental( 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/Elemental/Melee/SnowElemental.cs
Normal file
73
Scripts/Mobiles/Monsters/Elemental/Melee/SnowElemental.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a snow elemental corpse" )]
|
||||
public class SnowElemental : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SnowElemental() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a snow elemental";
|
||||
Body = 163;
|
||||
BaseSoundID = 263;
|
||||
|
||||
SetStr( 326, 355 );
|
||||
SetDex( 166, 185 );
|
||||
SetInt( 71, 95 );
|
||||
|
||||
SetHits( 196, 213 );
|
||||
|
||||
SetDamage( 11, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 10, 15 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 25, 35 );
|
||||
SetResistance( ResistanceType.Energy, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 50.1, 65.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
PackItem( new BlackPearl( 3 ) );
|
||||
Item ore = new IronOre( 3 );
|
||||
ore.ItemID = 0x19B8;
|
||||
PackItem( ore );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override int TreasureMapLevel{ get{ return Utility.RandomList( 2, 3 ); } }
|
||||
|
||||
public SnowElemental( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
110
Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs
Normal file
110
Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an ancient liche's corpse" )]
|
||||
public class AncientLich : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public AncientLich() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "ancient lich" );
|
||||
Body = 78;
|
||||
BaseSoundID = 412;
|
||||
|
||||
SetStr( 216, 305 );
|
||||
SetDex( 96, 115 );
|
||||
SetInt( 966, 1045 );
|
||||
|
||||
SetHits( 560, 595 );
|
||||
|
||||
SetDamage( 15, 27 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Cold, 40 );
|
||||
SetDamageType( ResistanceType.Energy, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 120.1, 130.0 );
|
||||
SetSkill( SkillName.Magery, 120.1, 130.0 );
|
||||
SetSkill( SkillName.Meditation, 100.1, 101.0 );
|
||||
SetSkill( SkillName.Poisoning, 100.1, 101.0 );
|
||||
SetSkill( SkillName.MagicResist, 175.2, 200.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 75.1, 100.0 );
|
||||
SetSkill( SkillName.Necromancy, 120.1, 130.0 );
|
||||
SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 );
|
||||
|
||||
Fame = 23000;
|
||||
Karma = -23000;
|
||||
|
||||
VirtualArmor = 60;
|
||||
PackNecroReg( 30, 275 );
|
||||
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x19D;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x175;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x108;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0xE2;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x28B;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 3 );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override bool Unprovokable{ get{ return true; } }
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public AncientLich( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
74
Scripts/Mobiles/Monsters/Humanoid/Magic/ArcaneDaemon.cs
Normal file
74
Scripts/Mobiles/Monsters/Humanoid/Magic/ArcaneDaemon.cs
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an arcane daemon corpse" )]
|
||||
public class ArcaneDaemon : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ConcussionBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public ArcaneDaemon() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an arcane daemon";
|
||||
Body = 0x310;
|
||||
BaseSoundID = 0x47D;
|
||||
|
||||
SetStr( 131, 150 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 301, 350 );
|
||||
|
||||
SetHits( 101, 115 );
|
||||
|
||||
SetDamage( 12, 16 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 80 );
|
||||
SetDamageType( ResistanceType.Fire, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 70, 80 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 80.1, 90.0 );
|
||||
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Meditation, 70.1, 80.0 );
|
||||
|
||||
Fame = 7000;
|
||||
Karma = -10000;
|
||||
|
||||
VirtualArmor = 55;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
|
||||
public ArcaneDaemon( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
79
Scripts/Mobiles/Monsters/Humanoid/Magic/Balron.cs
Normal file
79
Scripts/Mobiles/Monsters/Humanoid/Magic/Balron.cs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a balron corpse" )]
|
||||
public class Balron : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Balron () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "balron" );
|
||||
Body = 40;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 986, 1185 );
|
||||
SetDex( 177, 255 );
|
||||
SetInt( 151, 250 );
|
||||
|
||||
SetHits( 592, 711 );
|
||||
|
||||
SetDamage( 22, 29 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Fire, 25 );
|
||||
SetDamageType( ResistanceType.Energy, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 80 );
|
||||
SetResistance( ResistanceType.Fire, 60, 80 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 25.1, 50.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 95.5, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 25.1, 50.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.5, 150.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
|
||||
VirtualArmor = 90;
|
||||
|
||||
PackItem( new Longsword() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public Balron( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
188
Scripts/Mobiles/Monsters/Humanoid/Magic/Betrayer.cs
Normal file
188
Scripts/Mobiles/Monsters/Humanoid/Magic/Betrayer.cs
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a betrayer corpse" )]
|
||||
public class Betrayer : BaseCreature
|
||||
{
|
||||
private bool m_Stunning;
|
||||
|
||||
[Constructable]
|
||||
public Betrayer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a betrayer";
|
||||
Body = 767;
|
||||
|
||||
|
||||
SetStr( 401, 500 );
|
||||
SetDex( 81, 100 );
|
||||
SetInt( 151, 200 );
|
||||
|
||||
SetHits( 241, 300 );
|
||||
|
||||
SetDamage( 16, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 70 );
|
||||
SetResistance( ResistanceType.Fire, 60, 70 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 90.1, 100.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 50.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 120.1, 130.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
VirtualArmor = 65;
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
|
||||
PackItem( new PowerCrystal() );
|
||||
|
||||
if ( 0.02 > Utility.RandomDouble() )
|
||||
PackItem( new BlackthornWelcomeBook() );
|
||||
|
||||
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 5, 30 ) );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( 0.05 > Utility.RandomDouble() )
|
||||
{
|
||||
if ( !IsParagon )
|
||||
{
|
||||
if ( 0.75 > Utility.RandomDouble() )
|
||||
c.DropItem( DawnsMusicGear.RandomCommon );
|
||||
else
|
||||
c.DropItem( DawnsMusicGear.RandomUncommon );
|
||||
}
|
||||
else
|
||||
c.DropItem( DawnsMusicGear.RandomRare );
|
||||
}
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x423;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x23B;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x140;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Gems, 1 );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override bool BardImmune{ get{ return !Core.AOS; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( !m_Stunning && 0.3 > Utility.RandomDouble() )
|
||||
{
|
||||
m_Stunning = true;
|
||||
|
||||
defender.Animate( 21, 6, 1, true, false, 0 );
|
||||
this.PlaySound( 0xEE );
|
||||
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You have been stunned by a colossal blow!" );
|
||||
|
||||
BaseWeapon weapon = this.Weapon as BaseWeapon;
|
||||
if ( weapon != null )
|
||||
weapon.OnHit( this, defender );
|
||||
|
||||
if ( defender.Alive )
|
||||
{
|
||||
defender.Frozen = true;
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( Recover_Callback ), defender );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Recover_Callback( object state )
|
||||
{
|
||||
Mobile defender = state as Mobile;
|
||||
|
||||
if ( defender != null )
|
||||
{
|
||||
defender.Frozen = false;
|
||||
defender.Combatant = null;
|
||||
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You recover your senses." );
|
||||
}
|
||||
|
||||
m_Stunning = false;
|
||||
}
|
||||
|
||||
private DateTime m_NextAbilityTime;
|
||||
|
||||
public override void OnActionCombat()
|
||||
{
|
||||
Mobile combatant = Combatant;
|
||||
|
||||
if ( DateTime.UtcNow < m_NextAbilityTime || combatant == null || combatant.Deleted || combatant.Map != Map || !InRange( combatant, 3 ) || !CanBeHarmful( combatant ) || !InLOS( combatant ) )
|
||||
return;
|
||||
|
||||
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 5, 30 ) );
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
{
|
||||
this.FixedParticles( 0x376A, 9, 32, 0x2539, EffectLayer.LeftHand );
|
||||
this.PlaySound( 0x1DE );
|
||||
|
||||
foreach ( Mobile m in this.GetMobilesInRange( 2 ) )
|
||||
{
|
||||
if ( m != this && IsEnemy( m ) )
|
||||
{
|
||||
m.ApplyPoison( this, Poison.Deadly );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Betrayer( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
68
Scripts/Mobiles/Monsters/Humanoid/Magic/Bogle.cs
Normal file
68
Scripts/Mobiles/Monsters/Humanoid/Magic/Bogle.cs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ghostly corpse" )]
|
||||
public class Bogle : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Bogle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a bogle";
|
||||
Body = 153;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 7, 11 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 55.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 28;
|
||||
PackItem( Loot.RandomWeapon() );
|
||||
PackItem( new Bone() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public Bogle( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs
Normal file
83
Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a skeletal corpse" )]
|
||||
public class BoneMagi : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BoneMagi() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a bone mage";
|
||||
Body = 148;
|
||||
BaseSoundID = 451;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 56, 75 );
|
||||
SetInt( 186, 210 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 3, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
SetSkill( SkillName.Necromancy, 89, 99.1 );
|
||||
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 38;
|
||||
|
||||
PackReg( 3 );
|
||||
PackNecroReg( 3, 10 );
|
||||
PackItem( new Bone() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.LowScrolls );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
|
||||
public BoneMagi( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Scripts/Mobiles/Monsters/Humanoid/Magic/Daemon.cs
Normal file
82
Scripts/Mobiles/Monsters/Humanoid/Magic/Daemon.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Factions;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a daemon corpse" )]
|
||||
public class Daemon : BaseCreature
|
||||
{
|
||||
public override double DispelDifficulty{ get{ return 125.0; } }
|
||||
public override double DispelFocus{ get{ return 45.0; } }
|
||||
|
||||
public override Faction FactionAllegiance { get { return Shadowlords.Instance; } }
|
||||
public override Ethics.Ethic EthicAllegiance { get { return Ethics.Ethic.Evil; } }
|
||||
|
||||
[Constructable]
|
||||
public Daemon () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "daemon" );
|
||||
Body = 9;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 476, 505 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 301, 325 );
|
||||
|
||||
SetHits( 286, 303 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 60 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
VirtualArmor = 58;
|
||||
ControlSlots = Core.SE ? 4 : 5;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override int TreasureMapLevel{ get{ return 4; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public Daemon( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
70
Scripts/Mobiles/Monsters/Humanoid/Magic/ElderGazer.cs
Normal file
70
Scripts/Mobiles/Monsters/Humanoid/Magic/ElderGazer.cs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an elder gazer corpse" )]
|
||||
public class ElderGazer : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public ElderGazer () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an elder gazer";
|
||||
Body = 22;
|
||||
BaseSoundID = 377;
|
||||
|
||||
SetStr( 296, 325 );
|
||||
SetDex( 86, 105 );
|
||||
SetInt( 291, 385 );
|
||||
|
||||
SetHits( 178, 195 );
|
||||
|
||||
SetDamage( 8, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 60, 70 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 62.0, 100.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 115.1, 130.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
Fame = 12500;
|
||||
Karma = -12500;
|
||||
|
||||
VirtualArmor = 50;
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 0; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
public ElderGazer( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Humanoid/Magic/EvilMage.cs
Normal file
75
Scripts/Mobiles/Monsters/Humanoid/Magic/EvilMage.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an evil mage corpse" )]
|
||||
public class EvilMage : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public EvilMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "evil mage" );
|
||||
Title = "the evil mage";
|
||||
Body = 124;
|
||||
|
||||
SetStr( 81, 105 );
|
||||
SetDex( 91, 115 );
|
||||
SetInt( 96, 120 );
|
||||
|
||||
SetHits( 49, 63 );
|
||||
|
||||
SetDamage( 5, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 20 );
|
||||
SetResistance( ResistanceType.Fire, 5, 10 );
|
||||
SetResistance( ResistanceType.Poison, 5, 10 );
|
||||
SetResistance( ResistanceType.Energy, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 75.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 75.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 75.0, 97.5 );
|
||||
SetSkill( SkillName.Tactics, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Wrestling, 20.2, 60.0 );
|
||||
|
||||
Fame = 2500;
|
||||
Karma = -2500;
|
||||
|
||||
VirtualArmor = 16;
|
||||
PackReg( 6 );
|
||||
PackItem( new Robe( Utility.RandomNeutralHue() ) ); // TODO: Proper hue
|
||||
PackItem( new Sandals() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 1 : 0; } }
|
||||
|
||||
public EvilMage( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Scripts/Mobiles/Monsters/Humanoid/Magic/EvilMageLord.cs
Normal file
81
Scripts/Mobiles/Monsters/Humanoid/Magic/EvilMageLord.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an evil mage lord corpse" )]
|
||||
public class EvilMageLord : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public EvilMageLord() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "evil mage lord" );
|
||||
Body = Utility.RandomList( 125, 126 );
|
||||
|
||||
PackItem( new Robe( Utility.RandomMetalHue() ) );
|
||||
PackItem( new WizardsHat( Utility.RandomMetalHue() ) );
|
||||
|
||||
SetStr( 81, 105 );
|
||||
SetDex( 191, 215 );
|
||||
SetInt( 126, 150 );
|
||||
|
||||
SetHits( 49, 63 );
|
||||
|
||||
SetDamage( 5, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 80.2, 100.0 );
|
||||
SetSkill( SkillName.Magery, 95.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 27.5, 50.0 );
|
||||
SetSkill( SkillName.MagicResist, 77.5, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Wrestling, 20.3, 80.0 );
|
||||
|
||||
Fame = 10500;
|
||||
Karma = -10500;
|
||||
|
||||
VirtualArmor = 16;
|
||||
PackReg( 23 );
|
||||
if ( Utility.RandomBool() )
|
||||
PackItem( new Shoes() );
|
||||
else
|
||||
PackItem( new Sandals() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return Core.AOS ? 2 : 0; } }
|
||||
|
||||
public EvilMageLord( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
74
Scripts/Mobiles/Monsters/Humanoid/Magic/FireGargoyle.cs
Normal file
74
Scripts/Mobiles/Monsters/Humanoid/Magic/FireGargoyle.cs
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a charred corpse" )]
|
||||
public class FireGargoyle : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public FireGargoyle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "fire gargoyle" );
|
||||
Body = 130;
|
||||
BaseSoundID = 0x174;
|
||||
|
||||
SetStr( 351, 400 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 226, 250 );
|
||||
|
||||
SetHits( 211, 240 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Fire, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 75.1, 85.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.1, 105.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 105.0 );
|
||||
SetSkill( SkillName.Meditation, 90.1, 105.0 );
|
||||
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 32;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override bool HasBreath{ get{ return true; } } // fire breath enabled
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public FireGargoyle( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Humanoid/Magic/Gargoyle.cs
Normal file
75
Scripts/Mobiles/Monsters/Humanoid/Magic/Gargoyle.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gargoyle corpse" )]
|
||||
public class Gargoyle : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Gargoyle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a gargoyle";
|
||||
Body = 4;
|
||||
BaseSoundID = 372;
|
||||
|
||||
SetStr( 146, 175 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 81, 105 );
|
||||
|
||||
SetHits( 88, 105 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 5, 10 );
|
||||
SetResistance( ResistanceType.Poison, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.1, 85.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 85.0 );
|
||||
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 32;
|
||||
|
||||
if ( 0.025 > Utility.RandomDouble() )
|
||||
PackItem( new GargoylesPickaxe() );
|
||||
}
|
||||
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public Gargoyle( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
104
Scripts/Mobiles/Monsters/Humanoid/Magic/GargoyleDestroyer.cs
Normal file
104
Scripts/Mobiles/Monsters/Humanoid/Magic/GargoyleDestroyer.cs
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gargoyle corpse" )]
|
||||
public class GargoyleDestroyer : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GargoyleDestroyer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "Gargoyle Destroyer";
|
||||
Body = 0x2F3;
|
||||
BaseSoundID = 0x174;
|
||||
|
||||
SetStr( 760, 850 );
|
||||
SetDex( 102, 150 );
|
||||
SetInt( 152, 200 );
|
||||
|
||||
SetHits( 482, 485 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 60 );
|
||||
SetResistance( ResistanceType.Fire, 60, 70 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 15, 25 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 120.4, 160.0 );
|
||||
SetSkill( SkillName.Anatomy, 50.5, 100.0 );
|
||||
SetSkill( SkillName.Swords, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Macing, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Fencing, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 90.1, 100.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
if ( 0.2 > Utility.RandomDouble() )
|
||||
PackItem( new GargoylesPickaxe() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
AddLoot( LootPack.Gems, 2 );
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return !Core.AOS; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public override void OnDamagedBySpell( Mobile from )
|
||||
{
|
||||
if( from != null && from.Alive && 0.4 > Utility.RandomDouble() )
|
||||
{
|
||||
ThrowHatchet( from );
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if( attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble() )
|
||||
{
|
||||
ThrowHatchet( attacker );
|
||||
}
|
||||
}
|
||||
|
||||
public void ThrowHatchet( Mobile to )
|
||||
{
|
||||
int damage = 50;
|
||||
this.MovingEffect( to, 0xF43, 10, 0, false, false );
|
||||
this.DoHarmful( to );
|
||||
AOS.Damage( to, this, damage, 100, 0, 0, 0, 0 );
|
||||
}
|
||||
|
||||
public GargoyleDestroyer( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
79
Scripts/Mobiles/Monsters/Humanoid/Magic/GargoyleEnforcer.cs
Normal file
79
Scripts/Mobiles/Monsters/Humanoid/Magic/GargoyleEnforcer.cs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gargoyle corpse" )]
|
||||
public class GargoyleEnforcer : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.WhirlwindAttack;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public GargoyleEnforcer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "Gargoyle Enforcer";
|
||||
Body = 0x2F2;
|
||||
BaseSoundID = 0x174;
|
||||
|
||||
SetStr( 760, 850 );
|
||||
SetDex( 102, 150 );
|
||||
SetInt( 152, 200 );
|
||||
|
||||
SetHits( 482, 485 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 60 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 25, 35 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 120.1, 130.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Swords, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Anatomy, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 80.1, 90.0 );
|
||||
SetSkill( SkillName.EvalInt, 70.3, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 70.3, 100.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
if ( 0.2 > Utility.RandomDouble() )
|
||||
PackItem( new GargoylesPickaxe() );
|
||||
}
|
||||
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public GargoyleEnforcer( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/Humanoid/Magic/Gazer.cs
Normal file
72
Scripts/Mobiles/Monsters/Humanoid/Magic/Gazer.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gazer corpse" )]
|
||||
public class Gazer : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Gazer () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a gazer";
|
||||
Body = 22;
|
||||
BaseSoundID = 377;
|
||||
|
||||
SetStr( 96, 125 );
|
||||
SetDex( 86, 105 );
|
||||
SetInt( 141, 165 );
|
||||
|
||||
SetHits( 58, 75 );
|
||||
|
||||
SetDamage( 5, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 50.1, 65.0 );
|
||||
SetSkill( SkillName.Magery, 50.1, 65.0 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = -3500;
|
||||
|
||||
VirtualArmor = 36;
|
||||
|
||||
PackItem( new Nightshade( 4 ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public Gazer( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
95
Scripts/Mobiles/Monsters/Humanoid/Magic/GolemController.cs
Normal file
95
Scripts/Mobiles/Monsters/Humanoid/Magic/GolemController.cs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a golem controller corpse" )]
|
||||
public class GolemController : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GolemController() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "golem controller" );
|
||||
Title = "the controller";
|
||||
|
||||
Body = 400;
|
||||
Hue = 0x455;
|
||||
|
||||
AddArcane( new Robe() );
|
||||
AddArcane( new ThighBoots() );
|
||||
AddArcane( new LeatherGloves() );
|
||||
AddArcane( new Cloak() );
|
||||
|
||||
SetStr( 126, 150 );
|
||||
SetDex( 96, 120 );
|
||||
SetInt( 151, 175 );
|
||||
|
||||
SetHits( 76, 90 );
|
||||
|
||||
SetDamage( 6, 12 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 35, 45 );
|
||||
SetResistance( ResistanceType.Poison, 5, 15 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 95.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 95.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 95.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 102.5, 125.0 );
|
||||
SetSkill( SkillName.Tactics, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Wrestling, 65.0, 87.5 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 16;
|
||||
|
||||
if ( 0.7 > Utility.RandomDouble() )
|
||||
PackItem( new ArcaneGem() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public void AddArcane( Item item )
|
||||
{
|
||||
if ( item is IArcaneEquip )
|
||||
{
|
||||
IArcaneEquip eq = (IArcaneEquip)item;
|
||||
eq.CurArcaneCharges = eq.MaxArcaneCharges = 20;
|
||||
}
|
||||
|
||||
item.Hue = ArcaneGem.DefaultArcaneHue;
|
||||
item.LootType = LootType.Newbied;
|
||||
|
||||
AddItem( item );
|
||||
}
|
||||
|
||||
public override bool ClickTitle{ get{ return false; } }
|
||||
public override bool ShowFameTitle{ get{ return false; } }
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public GolemController( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
70
Scripts/Mobiles/Monsters/Humanoid/Magic/IceFiend.cs
Normal file
70
Scripts/Mobiles/Monsters/Humanoid/Magic/IceFiend.cs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an ice fiend corpse" )]
|
||||
public class IceFiend : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public IceFiend () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an ice fiend";
|
||||
Body = 43;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 376, 405 );
|
||||
SetDex( 176, 195 );
|
||||
SetInt( 201, 225 );
|
||||
|
||||
SetHits( 226, 243 );
|
||||
|
||||
SetDamage( 8, 19 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Magery, 80.1, 90.0 );
|
||||
SetSkill( SkillName.MagicResist, 75.1, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
|
||||
VirtualArmor = 60;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 4; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public IceFiend( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
80
Scripts/Mobiles/Monsters/Humanoid/Magic/Imp.cs
Normal file
80
Scripts/Mobiles/Monsters/Humanoid/Magic/Imp.cs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an imp corpse" )]
|
||||
public class Imp : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Imp() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an imp";
|
||||
Body = 74;
|
||||
BaseSoundID = 422;
|
||||
|
||||
SetStr( 91, 115 );
|
||||
SetDex( 61, 80 );
|
||||
SetInt( 86, 105 );
|
||||
|
||||
SetHits( 55, 70 );
|
||||
|
||||
SetDamage( 10, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Fire, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 35 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 20.1, 30.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 30.1, 50.0 );
|
||||
SetSkill( SkillName.Tactics, 42.1, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 44.0 );
|
||||
|
||||
Fame = 2500;
|
||||
Karma = -2500;
|
||||
|
||||
VirtualArmor = 30;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 2;
|
||||
MinTameSkill = 83.1;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int Hides{ get{ return 6; } }
|
||||
public override HideType HideType{ get{ return HideType.Spined; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override PackInstinct PackInstinct{ get{ return PackInstinct.Daemon; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public Imp( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
85
Scripts/Mobiles/Monsters/Humanoid/Magic/Lich.cs
Normal file
85
Scripts/Mobiles/Monsters/Humanoid/Magic/Lich.cs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a liche's corpse" )]
|
||||
public class Lich : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Lich() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a lich";
|
||||
Body = 24;
|
||||
BaseSoundID = 0x3E9;
|
||||
|
||||
SetStr( 171, 200 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 276, 305 );
|
||||
|
||||
SetHits( 103, 120 );
|
||||
|
||||
SetDamage( 24, 26 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 10 );
|
||||
SetDamageType( ResistanceType.Cold, 40 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 60 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 55, 65 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
|
||||
SetSkill( SkillName.Necromancy, 89, 99.1 );
|
||||
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 100.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Meditation, 85.1, 95.0 );
|
||||
SetSkill( SkillName.MagicResist, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 90.0 );
|
||||
|
||||
Fame = 8000;
|
||||
Karma = -8000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
PackItem( new GnarledStaff() );
|
||||
PackNecroReg( 17, 24 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
|
||||
public Lich( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
84
Scripts/Mobiles/Monsters/Humanoid/Magic/LichLord.cs
Normal file
84
Scripts/Mobiles/Monsters/Humanoid/Magic/LichLord.cs
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a liche's corpse" )]
|
||||
public class LichLord : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public LichLord() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a lich lord";
|
||||
Body = 79;
|
||||
BaseSoundID = 412;
|
||||
|
||||
SetStr( 416, 505 );
|
||||
SetDex( 146, 165 );
|
||||
SetInt( 566, 655 );
|
||||
|
||||
SetHits( 250, 303 );
|
||||
|
||||
SetDamage( 11, 13 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
SetDamageType( ResistanceType.Energy, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Necromancy, 90, 110.0 );
|
||||
SetSkill( SkillName.SpiritSpeak, 90.0, 110.0 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 150.5, 200.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
PackItem( new GnarledStaff() );
|
||||
PackNecroReg( 12, 40 );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 4; } }
|
||||
|
||||
public LichLord( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
108
Scripts/Mobiles/Monsters/Humanoid/Magic/OrcishMage.cs
Normal file
108
Scripts/Mobiles/Monsters/Humanoid/Magic/OrcishMage.cs
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a glowing orc corpse" )]
|
||||
public class OrcishMage : BaseCreature
|
||||
{
|
||||
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
|
||||
|
||||
[Constructable]
|
||||
public OrcishMage () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an orcish mage";
|
||||
Body = 140;
|
||||
BaseSoundID = 0x45A;
|
||||
|
||||
SetStr( 116, 150 );
|
||||
SetDex( 91, 115 );
|
||||
SetInt( 161, 185 );
|
||||
|
||||
SetHits( 70, 90 );
|
||||
|
||||
SetDamage( 4, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 35 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 72.5 );
|
||||
SetSkill( SkillName.Magery, 60.1, 72.5 );
|
||||
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 65.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 30;
|
||||
|
||||
|
||||
PackReg( 6 );
|
||||
|
||||
if ( 0.05 > Utility.RandomDouble() )
|
||||
PackItem( new OrcishKinMask() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.LowScrolls );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.SavagesAndOrcs; }
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( m.Player && m.FindItemOnLayer( Layer.Helm ) is OrcishKinMask )
|
||||
return false;
|
||||
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void AggressiveAction( Mobile aggressor, bool criminal )
|
||||
{
|
||||
base.AggressiveAction( aggressor, criminal );
|
||||
|
||||
Item item = aggressor.FindItemOnLayer( Layer.Helm );
|
||||
|
||||
if ( item is OrcishKinMask )
|
||||
{
|
||||
AOS.Damage( aggressor, 50, 0, 100, 0, 0, 0 );
|
||||
item.Delete();
|
||||
aggressor.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Head );
|
||||
aggressor.PlaySound( 0x307 );
|
||||
}
|
||||
}
|
||||
|
||||
public OrcishMage( 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/Humanoid/Magic/RatmanMage.cs
Normal file
87
Scripts/Mobiles/Monsters/Humanoid/Magic/RatmanMage.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a glowing ratman corpse" )]
|
||||
public class RatmanMage : BaseCreature
|
||||
{
|
||||
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Ratman; } }
|
||||
|
||||
[Constructable]
|
||||
public RatmanMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "ratman" );
|
||||
Body = 0x8F;
|
||||
BaseSoundID = 437;
|
||||
|
||||
SetStr( 146, 180 );
|
||||
SetDex( 101, 130 );
|
||||
SetInt( 186, 210 );
|
||||
|
||||
SetHits( 88, 108 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 45 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 65.1, 90.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 75.0 );
|
||||
|
||||
Fame = 7500;
|
||||
Karma = -7500;
|
||||
|
||||
VirtualArmor = 44;
|
||||
|
||||
PackReg( 6 );
|
||||
|
||||
if ( 0.02 > Utility.RandomDouble() )
|
||||
PackStatue();
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.LowScrolls );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int Hides{ get{ return 8; } }
|
||||
public override HideType HideType{ get{ return HideType.Spined; } }
|
||||
|
||||
public RatmanMage( 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();
|
||||
|
||||
if ( Body == 42 )
|
||||
{
|
||||
Body = 0x8F;
|
||||
Hue = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
290
Scripts/Mobiles/Monsters/Humanoid/Magic/SavageShaman.cs
Normal file
290
Scripts/Mobiles/Monsters/Humanoid/Magic/SavageShaman.cs
Normal file
|
|
@ -0,0 +1,290 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Spells;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a savage corpse" )]
|
||||
public class SavageShaman : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SavageShaman() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName( "savage shaman" );
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
Body = 184;
|
||||
else
|
||||
Body = 183;
|
||||
|
||||
SetStr( 126, 145 );
|
||||
SetDex( 91, 110 );
|
||||
SetInt( 161, 185 );
|
||||
|
||||
SetDamage( 4, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 77.5, 100.0 );
|
||||
SetSkill( SkillName.Fencing, 62.5, 85.0 );
|
||||
SetSkill( SkillName.Macing, 62.5, 85.0 );
|
||||
SetSkill( SkillName.Magery, 72.5, 95.0 );
|
||||
SetSkill( SkillName.Meditation, 77.5, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 77.5, 100.0 );
|
||||
SetSkill( SkillName.Swords, 62.5, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 62.5, 85.0 );
|
||||
SetSkill( SkillName.Wrestling, 62.5, 85.0 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
PackReg( 10, 15 );
|
||||
PackItem( new Bandage( Utility.RandomMinMax( 1, 15 ) ) );
|
||||
|
||||
if ( 0.1 > Utility.RandomDouble() )
|
||||
PackItem( new TribalBerry() );
|
||||
|
||||
AddItem( new BoneArms() );
|
||||
AddItem( new BoneLegs() );
|
||||
AddItem( new DeerMask() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override bool ShowFameTitle{ get{ return false; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.SavagesAndOrcs; }
|
||||
}
|
||||
|
||||
public override bool IsEnemy( Mobile m )
|
||||
{
|
||||
if ( m.BodyMod == 183 || m.BodyMod == 184 )
|
||||
return false;
|
||||
|
||||
return base.IsEnemy( m );
|
||||
}
|
||||
|
||||
public override void AggressiveAction( Mobile aggressor, bool criminal )
|
||||
{
|
||||
base.AggressiveAction( aggressor, criminal );
|
||||
|
||||
if ( aggressor.BodyMod == 183 || aggressor.BodyMod == 184 )
|
||||
{
|
||||
AOS.Damage( aggressor, 50, 0, 100, 0, 0, 0 );
|
||||
aggressor.BodyMod = 0;
|
||||
aggressor.HueMod = -1;
|
||||
aggressor.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Head );
|
||||
aggressor.PlaySound( 0x307 );
|
||||
aggressor.SendLocalizedMessage( 1040008 ); // Your skin is scorched as the tribal paint burns away!
|
||||
|
||||
if ( aggressor is PlayerMobile )
|
||||
((PlayerMobile)aggressor).SavagePaintExpiration = TimeSpan.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
public override void AlterMeleeDamageTo( Mobile to, ref int damage )
|
||||
{
|
||||
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
|
||||
damage *= 3;
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if ( 0.1 > Utility.RandomDouble() )
|
||||
BeginSavageDance();
|
||||
}
|
||||
|
||||
public void BeginSavageDance()
|
||||
{
|
||||
if( this.Map == null )
|
||||
return;
|
||||
|
||||
ArrayList list = new ArrayList();
|
||||
|
||||
foreach ( Mobile m in this.GetMobilesInRange( 8 ) )
|
||||
{
|
||||
if ( m != this && m is SavageShaman )
|
||||
list.Add( m );
|
||||
}
|
||||
|
||||
Animate( 111, 5, 1, true, false, 0 ); // Do a little dance...
|
||||
|
||||
if ( AIObject != null )
|
||||
AIObject.NextMove = Core.TickCount + 1000;
|
||||
|
||||
if ( list.Count >= 3 )
|
||||
{
|
||||
for ( int i = 0; i < list.Count; ++i )
|
||||
{
|
||||
SavageShaman dancer = (SavageShaman)list[i];
|
||||
|
||||
dancer.Animate( 111, 5, 1, true, false, 0 ); // Get down tonight...
|
||||
|
||||
if ( dancer.AIObject != null )
|
||||
dancer.AIObject.NextMove = Core.TickCount + 1000;
|
||||
}
|
||||
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerCallback( EndSavageDance ) );
|
||||
}
|
||||
}
|
||||
|
||||
public void EndSavageDance()
|
||||
{
|
||||
if ( Deleted )
|
||||
return;
|
||||
|
||||
ArrayList list = new ArrayList();
|
||||
|
||||
foreach ( Mobile m in this.GetMobilesInRange( 8 ) )
|
||||
list.Add( m );
|
||||
|
||||
if ( list.Count > 0 )
|
||||
{
|
||||
switch ( Utility.Random( 3 ) )
|
||||
{
|
||||
case 0: /* greater heal */
|
||||
{
|
||||
foreach ( Mobile m in list )
|
||||
{
|
||||
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
|
||||
|
||||
if ( !isFriendly )
|
||||
continue;
|
||||
|
||||
if ( m.Poisoned || MortalStrike.IsWounded( m ) || !CanBeBeneficial( m ) )
|
||||
continue;
|
||||
|
||||
DoBeneficial( m );
|
||||
|
||||
// Algorithm: (40% of magery) + (1-10)
|
||||
|
||||
int toHeal = (int)(Skills[SkillName.Magery].Value * 0.4);
|
||||
toHeal += Utility.Random( 1, 10 );
|
||||
|
||||
m.Heal( toHeal, this );
|
||||
|
||||
m.FixedParticles( 0x376A, 9, 32, 5030, EffectLayer.Waist );
|
||||
m.PlaySound( 0x202 );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 1: /* lightning */
|
||||
{
|
||||
foreach ( Mobile m in list )
|
||||
{
|
||||
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
|
||||
|
||||
if ( isFriendly )
|
||||
continue;
|
||||
|
||||
if ( !CanBeHarmful( m ) )
|
||||
continue;
|
||||
|
||||
DoHarmful( m );
|
||||
|
||||
double damage;
|
||||
|
||||
if ( Core.AOS )
|
||||
{
|
||||
int baseDamage = 6 + (int)(Skills[SkillName.EvalInt].Value / 5.0);
|
||||
|
||||
damage = Utility.RandomMinMax( baseDamage, baseDamage + 3 );
|
||||
}
|
||||
else
|
||||
{
|
||||
damage = Utility.Random( 12, 9 );
|
||||
}
|
||||
|
||||
m.BoltEffect( 0 );
|
||||
|
||||
SpellHelper.Damage( TimeSpan.FromSeconds( 0.25 ), m, this, damage, 0, 0, 0, 0, 100 );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 2: /* poison */
|
||||
{
|
||||
foreach ( Mobile m in list )
|
||||
{
|
||||
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
|
||||
|
||||
if ( isFriendly )
|
||||
continue;
|
||||
|
||||
if ( !CanBeHarmful( m ) )
|
||||
continue;
|
||||
|
||||
DoHarmful( m );
|
||||
|
||||
if ( m.Spell != null )
|
||||
m.Spell.OnCasterHurt();
|
||||
|
||||
m.Paralyzed = false;
|
||||
|
||||
double total = Skills[SkillName.Magery].Value + Skills[SkillName.Poisoning].Value;
|
||||
|
||||
double dist = GetDistanceToSqrt( m );
|
||||
|
||||
if ( dist >= 3.0 )
|
||||
total -= (dist - 3.0) * 10.0;
|
||||
|
||||
int level;
|
||||
|
||||
if ( total >= 200.0 && Utility.Random( 1, 100 ) <= 10 )
|
||||
level = 3;
|
||||
else if ( total > 170.0 )
|
||||
level = 2;
|
||||
else if ( total > 130.0 )
|
||||
level = 1;
|
||||
else
|
||||
level = 0;
|
||||
|
||||
m.ApplyPoison( this, Poison.GetPoison( level ) );
|
||||
|
||||
m.FixedParticles( 0x374A, 10, 15, 5021, EffectLayer.Waist );
|
||||
m.PlaySound( 0x474 );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public SavageShaman( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Shade.cs
Normal file
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Shade.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ghostly corpse" )]
|
||||
public class Shade : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Shade() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a shade";
|
||||
Body = 26;
|
||||
Hue = 0x4001;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 7, 11 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 55.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackReg( 10 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public Shade( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs
Normal file
82
Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a skeletal corpse" )]
|
||||
public class SkeletalMage : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SkeletalMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a skeletal mage";
|
||||
Body = 148;
|
||||
BaseSoundID = 451;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 56, 75 );
|
||||
SetInt( 186, 210 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 3, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 60.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
SetSkill( SkillName.Necromancy, 89, 99.1 );
|
||||
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 38;
|
||||
PackReg( 3 );
|
||||
PackNecroReg( 3, 10 );
|
||||
PackItem( new Bone() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.LowScrolls );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
|
||||
public SkeletalMage( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Spectre.cs
Normal file
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Spectre.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ghostly corpse" )]
|
||||
public class Spectre : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Spectre() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a spectre";
|
||||
Body = 26;
|
||||
Hue = 0x4001;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 7, 11 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 55.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackReg( 10 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public Spectre( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs
Normal file
120
Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a succubus corpse" )]
|
||||
public class Succubus : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Succubus () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a succubus";
|
||||
Body = 149;
|
||||
BaseSoundID = 0x4B0;
|
||||
|
||||
SetStr( 488, 620 );
|
||||
SetDex( 121, 170 );
|
||||
SetInt( 498, 657 );
|
||||
|
||||
SetHits( 312, 353 );
|
||||
|
||||
SetDamage( 18, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 75 );
|
||||
SetDamageType( ResistanceType.Energy, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 80, 90 );
|
||||
SetResistance( ResistanceType.Fire, 70, 80 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 99.1, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.5, 150.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 90.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
|
||||
VirtualArmor = 80;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
AddLoot( LootPack.MedScrolls, 2 );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public void DrainLife()
|
||||
{
|
||||
ArrayList list = new ArrayList();
|
||||
|
||||
foreach ( Mobile m in this.GetMobilesInRange( 2 ) )
|
||||
{
|
||||
if ( m == this || !CanBeHarmful( m ) )
|
||||
continue;
|
||||
|
||||
if ( m is BaseCreature && (((BaseCreature)m).Controlled || ((BaseCreature)m).Summoned || ((BaseCreature)m).Team != this.Team) )
|
||||
list.Add( m );
|
||||
else if ( m.Player )
|
||||
list.Add( m );
|
||||
}
|
||||
|
||||
foreach ( Mobile m in list )
|
||||
{
|
||||
DoHarmful( m );
|
||||
|
||||
m.FixedParticles( 0x374A, 10, 15, 5013, 0x496, 0, EffectLayer.Waist );
|
||||
m.PlaySound( 0x231 );
|
||||
|
||||
//m.SendMessage( "You feel the life drain out of you!" );
|
||||
|
||||
int toDrain = Utility.RandomMinMax( 10, 40 );
|
||||
|
||||
Hits += toDrain;
|
||||
m.Damage( toDrain, this );
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( 0.1 >= Utility.RandomDouble() )
|
||||
DrainLife();
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if ( 0.1 >= Utility.RandomDouble() )
|
||||
DrainLife();
|
||||
}
|
||||
|
||||
public Succubus( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Humanoid/Magic/Titan.cs
Normal file
75
Scripts/Mobiles/Monsters/Humanoid/Magic/Titan.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a titans corpse" )]
|
||||
public class Titan : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Titan() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a titan";
|
||||
Body = 76;
|
||||
BaseSoundID = 609;
|
||||
|
||||
SetStr( 536, 585 );
|
||||
SetDex( 126, 145 );
|
||||
SetInt( 281, 305 );
|
||||
|
||||
SetHits( 322, 351 );
|
||||
|
||||
SetDamage( 13, 16 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 85.1, 100.0 );
|
||||
SetSkill( SkillName.Magery, 85.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 80.2, 110.0 );
|
||||
SetSkill( SkillName.Tactics, 60.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
|
||||
|
||||
Fame = 11500;
|
||||
Karma = -11500;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
if ( Core.ML && Utility.RandomDouble() < .33 )
|
||||
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(1) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.MedScrolls );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 4; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public Titan( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Wraith.cs
Normal file
77
Scripts/Mobiles/Monsters/Humanoid/Magic/Wraith.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ghostly corpse" )]
|
||||
public class Wraith : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Wraith() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a wraith";
|
||||
Body = 26;
|
||||
Hue = 0x4001;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
|
||||
SetDamage( 7, 11 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Magery, 55.1, 70.0 );
|
||||
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackReg( 10 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public Wraith( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/Humanoid/Melee/ArcticOgreLord.cs
Normal file
72
Scripts/Mobiles/Monsters/Humanoid/Melee/ArcticOgreLord.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a frozen ogre lord's corpse" )]
|
||||
[TypeAlias( "Server.Mobiles.ArticOgreLord" )]
|
||||
public class ArcticOgreLord : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public ArcticOgreLord() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an arctic ogre lord";
|
||||
Body = 135;
|
||||
BaseSoundID = 427;
|
||||
|
||||
SetStr( 767, 945 );
|
||||
SetDex( 66, 75 );
|
||||
SetInt( 46, 70 );
|
||||
|
||||
SetHits( 476, 552 );
|
||||
|
||||
SetDamage( 20, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 30 );
|
||||
SetDamageType( ResistanceType.Cold, 70 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 125.1, 140.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
PackItem( new Club() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
|
||||
public ArcticOgreLord( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
88
Scripts/Mobiles/Monsters/Humanoid/Melee/BoneKnight.cs
Normal file
88
Scripts/Mobiles/Monsters/Humanoid/Melee/BoneKnight.cs
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a skeletal corpse" )]
|
||||
public class BoneKnight : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public BoneKnight() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a bone knight";
|
||||
Body = 57;
|
||||
BaseSoundID = 451;
|
||||
|
||||
SetStr( 196, 250 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 118, 150 );
|
||||
|
||||
SetDamage( 8, 18 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 85.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 85.1, 95.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
switch ( Utility.Random( 6 ) )
|
||||
{
|
||||
case 0: PackItem( new PlateArms() ); break;
|
||||
case 1: PackItem( new PlateChest() ); break;
|
||||
case 2: PackItem( new PlateGloves() ); break;
|
||||
case 3: PackItem( new PlateGorget() ); break;
|
||||
case 4: PackItem( new PlateLegs() ); break;
|
||||
case 5: PackItem( new PlateHelm() ); break;
|
||||
}
|
||||
|
||||
PackSlayer();
|
||||
PackItem( new Scimitar() );
|
||||
PackItem( new WoodenShield() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public BoneKnight( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
101
Scripts/Mobiles/Monsters/Humanoid/Melee/Brigand.cs
Normal file
101
Scripts/Mobiles/Monsters/Humanoid/Melee/Brigand.cs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.ContextMenus;
|
||||
using Server.Misc;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class Brigand : BaseCreature
|
||||
{
|
||||
public override bool ClickTitle{ get{ return false; } }
|
||||
|
||||
[Constructable]
|
||||
public Brigand() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
Title = "the brigand";
|
||||
Hue = Utility.RandomSkinHue();
|
||||
|
||||
if ( this.Female = Utility.RandomBool() )
|
||||
{
|
||||
Body = 0x191;
|
||||
Name = NameList.RandomName( "female" );
|
||||
AddItem( new Skirt( Utility.RandomNeutralHue() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Body = 0x190;
|
||||
Name = NameList.RandomName( "male" );
|
||||
AddItem( new ShortPants( Utility.RandomNeutralHue() ) );
|
||||
}
|
||||
|
||||
SetStr( 86, 100 );
|
||||
SetDex( 81, 95 );
|
||||
SetInt( 61, 75 );
|
||||
|
||||
SetDamage( 10, 23 );
|
||||
|
||||
SetSkill( SkillName.Fencing, 66.0, 97.5 );
|
||||
SetSkill( SkillName.Macing, 65.0, 87.5 );
|
||||
SetSkill( SkillName.MagicResist, 25.0, 47.5 );
|
||||
SetSkill( SkillName.Swords, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Tactics, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Wrestling, 15.0, 37.5 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
AddItem( new Boots( Utility.RandomNeutralHue() ) );
|
||||
AddItem( new FancyShirt());
|
||||
AddItem( new Bandana());
|
||||
|
||||
switch ( Utility.Random( 7 ))
|
||||
{
|
||||
case 0: AddItem( new Longsword() ); break;
|
||||
case 1: AddItem( new Cutlass() ); break;
|
||||
case 2: AddItem( new Broadsword() ); break;
|
||||
case 3: AddItem( new Axe() ); break;
|
||||
case 4: AddItem( new Club() ); break;
|
||||
case 5: AddItem( new Dagger() ); break;
|
||||
case 6: AddItem( new Spear() ); break;
|
||||
}
|
||||
|
||||
Utility.AssignRandomHair( this );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.9 )
|
||||
c.DropItem( new SeveredHumanEars() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public Brigand( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
72
Scripts/Mobiles/Monsters/Humanoid/Melee/ChaosDaemon.cs
Normal file
72
Scripts/Mobiles/Monsters/Humanoid/Melee/ChaosDaemon.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a chaos daemon corpse" )]
|
||||
public class ChaosDaemon : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.CrushingBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public ChaosDaemon() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a chaos daemon";
|
||||
Body = 792;
|
||||
BaseSoundID = 0x3E9;
|
||||
|
||||
SetStr( 106, 130 );
|
||||
SetDex( 171, 200 );
|
||||
SetInt( 56, 80 );
|
||||
|
||||
SetHits( 91, 110 );
|
||||
|
||||
SetDamage( 12, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 85 );
|
||||
SetDamageType( ResistanceType.Fire, 15 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 60, 70 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 95.1, 100.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 15;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public ChaosDaemon( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
85
Scripts/Mobiles/Monsters/Humanoid/Melee/Cursed.cs
Normal file
85
Scripts/Mobiles/Monsters/Humanoid/Melee/Cursed.cs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an inhuman corpse" )]
|
||||
public class Cursed : BaseCreature
|
||||
{
|
||||
public override bool ClickTitle{ get{ return false; } }
|
||||
public override bool ShowFameTitle{ get{ return false; } }
|
||||
|
||||
[Constructable]
|
||||
public Cursed() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Title = "the Cursed";
|
||||
|
||||
Hue = Utility.RandomMinMax( 0x8596, 0x8599 );
|
||||
Body = 0x190;
|
||||
Name = NameList.RandomName( "male" );
|
||||
BaseSoundID = 471;
|
||||
|
||||
AddItem( new ShortPants( Utility.RandomNeutralHue() ) );
|
||||
AddItem( new Shirt( Utility.RandomNeutralHue() ) );
|
||||
|
||||
BaseWeapon weapon = Loot.RandomWeapon();
|
||||
weapon.Movable = false;
|
||||
AddItem( weapon );
|
||||
|
||||
SetStr( 91, 100 );
|
||||
SetDex( 86, 95 );
|
||||
SetInt( 61, 70 );
|
||||
|
||||
SetHits( 91, 120 );
|
||||
|
||||
SetDamage( 5, 13 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 25 );
|
||||
SetResistance( ResistanceType.Fire, 5, 10 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 5, 10 );
|
||||
SetResistance( ResistanceType.Energy, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.Fencing, 46.0, 77.5 );
|
||||
SetSkill( SkillName.Macing, 35.0, 57.5 );
|
||||
SetSkill( SkillName.MagicResist, 53.5, 62.5 );
|
||||
SetSkill( SkillName.Swords, 55.0, 77.5 );
|
||||
SetSkill( SkillName.Tactics, 60.0, 82.5 );
|
||||
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -2000;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
//AddLoot( LootPack.Miscellaneous );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public Cursed( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
70
Scripts/Mobiles/Monsters/Humanoid/Melee/Cyclops.cs
Normal file
70
Scripts/Mobiles/Monsters/Humanoid/Melee/Cyclops.cs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a cyclopean corpse" )]
|
||||
public class Cyclops : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Cyclops() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a cyclopean warrior";
|
||||
Body = 75;
|
||||
BaseSoundID = 604;
|
||||
|
||||
SetStr( 336, 385 );
|
||||
SetDex( 96, 115 );
|
||||
SetInt( 31, 55 );
|
||||
|
||||
SetHits( 202, 231 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 7, 23 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 50 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 60.3, 105.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
||||
|
||||
Fame = 4500;
|
||||
Karma = -4500;
|
||||
|
||||
VirtualArmor = 48;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 4; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
|
||||
public Cyclops( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
64
Scripts/Mobiles/Monsters/Humanoid/Melee/Doppleganger.cs
Normal file
64
Scripts/Mobiles/Monsters/Humanoid/Melee/Doppleganger.cs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a doppleganger corpse" )]
|
||||
public class Doppleganger : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Doppleganger() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a doppleganger";
|
||||
Body = 0x309;
|
||||
BaseSoundID = 0x451;
|
||||
|
||||
SetStr( 81, 110 );
|
||||
SetDex( 56, 75 );
|
||||
SetInt( 81, 105 );
|
||||
|
||||
SetHits( 101, 120 );
|
||||
|
||||
SetDamage( 8, 12 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 60 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 75.1, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
VirtualArmor = 55;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override int Hides{ get{ return 6; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public Doppleganger( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
114
Scripts/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs
Normal file
114
Scripts/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.ContextMenus;
|
||||
using Server.Misc;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
// TODO: Needs some Spellweaving abilities
|
||||
public class ElfBrigand : BaseCreature
|
||||
{
|
||||
public override bool ClickTitle{ get{ return false; } }
|
||||
|
||||
[Constructable]
|
||||
public ElfBrigand() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
Title = "the brigand";
|
||||
Race = Race.Elf;
|
||||
Hue = Race.RandomSkinHue();
|
||||
|
||||
if ( this.Female = Utility.RandomBool() )
|
||||
{
|
||||
Body = 0x25E;
|
||||
Name = NameList.RandomName( "female elf brigand" );
|
||||
|
||||
switch ( Utility.Random( 2 ) )
|
||||
{
|
||||
case 0: AddItem( new Skirt( Utility.RandomNondyedHue() ) ); break;
|
||||
case 1: AddItem( new Kilt( Utility.RandomNondyedHue() ) ); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Body = 0x25D;
|
||||
Name = NameList.RandomName( "male elf brigand" );
|
||||
AddItem( new ShortPants( Utility.RandomNondyedHue() ) );
|
||||
}
|
||||
|
||||
SetStr( 86, 100 );
|
||||
SetDex( 81, 95 );
|
||||
SetInt( 61, 75 );
|
||||
|
||||
SetDamage( 10, 23 );
|
||||
|
||||
SetSkill( SkillName.Fencing, 66.0, 97.5 );
|
||||
SetSkill( SkillName.Macing, 65.0, 87.5 );
|
||||
SetSkill( SkillName.MagicResist, 25.0, 47.5 );
|
||||
SetSkill( SkillName.Swords, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Tactics, 65.0, 87.5 );
|
||||
SetSkill( SkillName.Wrestling, 15.0, 37.5 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
switch ( Utility.Random( 4 ) )
|
||||
{
|
||||
case 0: AddItem( new Boots() ); break;
|
||||
case 1: AddItem( new ThighBoots() ); break;
|
||||
case 2: AddItem( new Sandals() ); break;
|
||||
case 3: AddItem( new Shoes() ); break;
|
||||
}
|
||||
|
||||
AddItem( new Shirt( Utility.RandomNondyedHue() ) );
|
||||
|
||||
switch ( Utility.Random( 7 ) )
|
||||
{
|
||||
case 0: AddItem( new Longsword() ); break;
|
||||
case 1: AddItem( new Cutlass() ); break;
|
||||
case 2: AddItem( new Broadsword() ); break;
|
||||
case 3: AddItem( new Axe() ); break;
|
||||
case 4: AddItem( new Club() ); break;
|
||||
case 5: AddItem( new Dagger() ); break;
|
||||
case 6: AddItem( new Spear() ); break;
|
||||
}
|
||||
|
||||
Utility.AssignRandomHair( this, true );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.9 )
|
||||
c.DropItem( new SeveredElfEars() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public ElfBrigand( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
68
Scripts/Mobiles/Monsters/Humanoid/Melee/EnslavedGargoyle.cs
Normal file
68
Scripts/Mobiles/Monsters/Humanoid/Melee/EnslavedGargoyle.cs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an enslaved gargoyle corpse" )]
|
||||
public class EnslavedGargoyle : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public EnslavedGargoyle() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an enslaved gargoyle";
|
||||
Body = 0x2F1;
|
||||
BaseSoundID = 0x174;
|
||||
|
||||
SetStr( 302, 360 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 81, 105 );
|
||||
|
||||
SetHits( 186,212 );
|
||||
|
||||
SetDamage( 7, 14 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 50, 70 );
|
||||
SetResistance( ResistanceType.Cold, 15, 25 );
|
||||
SetResistance( ResistanceType.Poison, 25, 30 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
|
||||
|
||||
Fame = 3500;
|
||||
Karma = 0;
|
||||
|
||||
VirtualArmor = 35;
|
||||
|
||||
if ( 0.2 > Utility.RandomDouble() )
|
||||
PackItem( new GargoylesPickaxe() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average, 2 );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public EnslavedGargoyle( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
71
Scripts/Mobiles/Monsters/Humanoid/Melee/Ettin.cs
Normal file
71
Scripts/Mobiles/Monsters/Humanoid/Melee/Ettin.cs
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an ettins corpse" )]
|
||||
public class Ettin : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Ettin() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an ettin";
|
||||
Body = 18;
|
||||
BaseSoundID = 367;
|
||||
|
||||
SetStr( 136, 165 );
|
||||
SetDex( 56, 75 );
|
||||
SetInt( 31, 55 );
|
||||
|
||||
SetHits( 82, 99 );
|
||||
|
||||
SetDamage( 7, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 15, 25 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 15, 25 );
|
||||
SetResistance( ResistanceType.Energy, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 38;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Potions );
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
public override int Meat{ get{ return 4; } }
|
||||
|
||||
public Ettin( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
93
Scripts/Mobiles/Monsters/Humanoid/Melee/Executioner.cs
Normal file
93
Scripts/Mobiles/Monsters/Humanoid/Melee/Executioner.cs
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.ContextMenus;
|
||||
using Server.Misc;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class Executioner : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Executioner() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
Title = "the executioner";
|
||||
Hue = Utility.RandomSkinHue();
|
||||
|
||||
if ( this.Female = Utility.RandomBool() )
|
||||
{
|
||||
this.Body = 0x191;
|
||||
this.Name = NameList.RandomName( "female" );
|
||||
AddItem( new Skirt( Utility.RandomRedHue() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Body = 0x190;
|
||||
this.Name = NameList.RandomName( "male" );
|
||||
AddItem( new ShortPants( Utility.RandomRedHue() ) );
|
||||
}
|
||||
|
||||
SetStr( 386, 400 );
|
||||
SetDex( 151, 165 );
|
||||
SetInt( 161, 175 );
|
||||
|
||||
SetDamage( 8, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 45 );
|
||||
SetResistance( ResistanceType.Fire, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 25, 30 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 125.0 );
|
||||
SetSkill( SkillName.Fencing, 46.0, 77.5 );
|
||||
SetSkill( SkillName.Macing, 35.0, 57.5 );
|
||||
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
|
||||
SetSkill( SkillName.MagicResist, 83.5, 92.5 );
|
||||
SetSkill( SkillName.Swords, 125.0 );
|
||||
SetSkill( SkillName.Tactics, 125.0 );
|
||||
SetSkill( SkillName.Lumberjacking, 125.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
AddItem( new ThighBoots( Utility.RandomRedHue() ) );
|
||||
AddItem( new Surcoat( Utility.RandomRedHue() ) );
|
||||
AddItem( new ExecutionersAxe());
|
||||
|
||||
Utility.AssignRandomHair( this );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
public Executioner( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
71
Scripts/Mobiles/Monsters/Humanoid/Melee/FrostTroll.cs
Normal file
71
Scripts/Mobiles/Monsters/Humanoid/Melee/FrostTroll.cs
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a frost troll corpse" )]
|
||||
public class FrostTroll : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public FrostTroll() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a frost troll";
|
||||
Body = 55;
|
||||
BaseSoundID = 461;
|
||||
|
||||
SetStr( 227, 265 );
|
||||
SetDex( 66, 85 );
|
||||
SetInt( 46, 70 );
|
||||
|
||||
SetHits( 140, 156 );
|
||||
|
||||
SetDamage( 14, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 75 );
|
||||
SetDamageType( ResistanceType.Cold, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 5, 10 );
|
||||
SetResistance( ResistanceType.Energy, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 80.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
|
||||
|
||||
Fame = 4000;
|
||||
Karma = -4000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
PackItem( new DoubleAxe() ); // TODO: Weapon??
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 2; } }
|
||||
public override int TreasureMapLevel{ get{ return 1; } }
|
||||
|
||||
public FrostTroll( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
64
Scripts/Mobiles/Monsters/Humanoid/Melee/GazerLarva.cs
Normal file
64
Scripts/Mobiles/Monsters/Humanoid/Melee/GazerLarva.cs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a gazer larva corpse" )]
|
||||
public class GazerLarva : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GazerLarva () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a gazer larva";
|
||||
Body = 778;
|
||||
BaseSoundID = 377;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 51, 75 );
|
||||
SetInt( 56, 80 );
|
||||
|
||||
SetHits( 36, 47 );
|
||||
|
||||
SetDamage( 2, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.0 );
|
||||
SetSkill( SkillName.Tactics, 70.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.0 );
|
||||
|
||||
Fame = 900;
|
||||
Karma = -900;
|
||||
|
||||
VirtualArmor = 25;
|
||||
|
||||
PackItem( new Nightshade( Utility.RandomMinMax( 2, 3 ) ) );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public GazerLarva( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/Humanoid/Melee/Ghoul.cs
Normal file
75
Scripts/Mobiles/Monsters/Humanoid/Melee/Ghoul.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ghostly corpse" )]
|
||||
public class Ghoul : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Ghoul() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a ghoul";
|
||||
Body = 153;
|
||||
BaseSoundID = 0x482;
|
||||
|
||||
SetStr( 76, 100 );
|
||||
SetDex( 76, 95 );
|
||||
SetInt( 36, 60 );
|
||||
|
||||
SetHits( 46, 60 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 7, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 5, 10 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Tactics, 45.1, 60.0 );
|
||||
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
|
||||
|
||||
Fame = 2500;
|
||||
Karma = -2500;
|
||||
|
||||
VirtualArmor = 28;
|
||||
|
||||
PackItem( Loot.RandomWeapon() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Meager );
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
|
||||
public Ghoul( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
71
Scripts/Mobiles/Monsters/Humanoid/Melee/GreaterMongbat.cs
Normal file
71
Scripts/Mobiles/Monsters/Humanoid/Melee/GreaterMongbat.cs
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a mongbat corpse" )]
|
||||
public class GreaterMongbat : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GreaterMongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a greater mongbat";
|
||||
Body = 39;
|
||||
BaseSoundID = 422;
|
||||
|
||||
SetStr( 56, 80 );
|
||||
SetDex( 61, 80 );
|
||||
SetInt( 26, 50 );
|
||||
|
||||
SetHits( 34, 48 );
|
||||
SetStam( 61, 80);
|
||||
SetMana( 26, 50 );
|
||||
|
||||
SetDamage( 5, 7 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 15.1, 30.0 );
|
||||
SetSkill( SkillName.Tactics, 35.1, 50.0 );
|
||||
SetSkill( SkillName.Wrestling, 20.1, 35.0 );
|
||||
|
||||
Fame = 450;
|
||||
Karma = -450;
|
||||
|
||||
VirtualArmor = 10;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = 71.1;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int Hides{ get{ return 6; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
|
||||
public GreaterMongbat( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
91
Scripts/Mobiles/Monsters/Humanoid/Melee/Guardian.cs
Normal file
91
Scripts/Mobiles/Monsters/Humanoid/Melee/Guardian.cs
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class Guardian : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Guardian() : base( AIType.AI_Archer, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
InitStats( 100, 125, 25 );
|
||||
Title = "the guardian";
|
||||
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
|
||||
Hue = Utility.RandomSkinHue();
|
||||
|
||||
if ( Female = Utility.RandomBool() )
|
||||
{
|
||||
Body = 0x191;
|
||||
Name = NameList.RandomName( "female" );
|
||||
}
|
||||
else
|
||||
{
|
||||
Body = 0x190;
|
||||
Name = NameList.RandomName( "male" );
|
||||
}
|
||||
|
||||
new ForestOstard().Rider = this;
|
||||
|
||||
PlateChest chest = new PlateChest();
|
||||
chest.Hue = 0x966;
|
||||
AddItem( chest );
|
||||
PlateArms arms = new PlateArms();
|
||||
arms.Hue = 0x966;
|
||||
AddItem( arms );
|
||||
PlateGloves gloves = new PlateGloves();
|
||||
gloves.Hue = 0x966;
|
||||
AddItem( gloves );
|
||||
PlateGorget gorget = new PlateGorget();
|
||||
gorget.Hue = 0x966;
|
||||
AddItem( gorget );
|
||||
PlateLegs legs = new PlateLegs();
|
||||
legs.Hue = 0x966;
|
||||
AddItem( legs );
|
||||
PlateHelm helm = new PlateHelm();
|
||||
helm.Hue = 0x966;
|
||||
AddItem( helm );
|
||||
|
||||
|
||||
Bow bow = new Bow();
|
||||
|
||||
bow.Movable = false;
|
||||
bow.Crafter = this;
|
||||
bow.Quality = WeaponQuality.Exceptional;
|
||||
|
||||
AddItem( bow );
|
||||
|
||||
PackItem( new Arrow( 250 ) );
|
||||
PackGold( 250, 500 );
|
||||
|
||||
Skills[SkillName.Anatomy].Base = 120.0;
|
||||
Skills[SkillName.Tactics].Base = 120.0;
|
||||
Skills[SkillName.Archery].Base = 120.0;
|
||||
Skills[SkillName.MagicResist].Base = 120.0;
|
||||
Skills[SkillName.DetectHidden].Base = 100.0;
|
||||
|
||||
}
|
||||
|
||||
public Guardian( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
66
Scripts/Mobiles/Monsters/Humanoid/Melee/HeadlessOne.cs
Normal file
66
Scripts/Mobiles/Monsters/Humanoid/Melee/HeadlessOne.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a headless corpse" )]
|
||||
public class HeadlessOne : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public HeadlessOne() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a headless one";
|
||||
Body = 31;
|
||||
Hue = Utility.RandomSkinHue() & 0x7FFF;
|
||||
BaseSoundID = 0x39D;
|
||||
|
||||
SetStr( 26, 50 );
|
||||
SetDex( 36, 55 );
|
||||
SetInt( 16, 30 );
|
||||
|
||||
SetHits( 16, 30 );
|
||||
|
||||
SetDamage( 5, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 20 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 15.1, 20.0 );
|
||||
SetSkill( SkillName.Tactics, 25.1, 40.0 );
|
||||
SetSkill( SkillName.Wrestling, 25.1, 40.0 );
|
||||
|
||||
Fame = 450;
|
||||
Karma = -450;
|
||||
|
||||
VirtualArmor = 18;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
// TODO: body parts
|
||||
}
|
||||
|
||||
public override bool CanRummageCorpses{ get{ return true; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
|
||||
public HeadlessOne( 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/Humanoid/Melee/HordeMinion.cs
Normal file
87
Scripts/Mobiles/Monsters/Humanoid/Melee/HordeMinion.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a horde minion corpse" )]
|
||||
public class HordeMinion : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public HordeMinion () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a horde minion";
|
||||
Body = 776;
|
||||
BaseSoundID = 357;
|
||||
|
||||
SetStr( 16, 40 );
|
||||
SetDex( 31, 60 );
|
||||
SetInt( 11, 25 );
|
||||
|
||||
SetHits( 10, 24 );
|
||||
|
||||
SetDamage( 5, 10 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 15, 20 );
|
||||
SetResistance( ResistanceType.Fire, 5, 10 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 10.0 );
|
||||
SetSkill( SkillName.Tactics, 0.1, 15.0 );
|
||||
SetSkill( SkillName.Wrestling, 25.1, 40.0 );
|
||||
|
||||
Fame = 500;
|
||||
Karma = -500;
|
||||
|
||||
VirtualArmor = 18;
|
||||
|
||||
AddItem( new LightSource() );
|
||||
|
||||
PackItem( new Bone( 3 ) );
|
||||
// TODO: Body parts
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 338;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 338;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 338;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 406;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 194;
|
||||
}
|
||||
|
||||
public HordeMinion( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
158
Scripts/Mobiles/Monsters/Humanoid/Melee/Juggernaut.cs
Normal file
158
Scripts/Mobiles/Monsters/Humanoid/Melee/Juggernaut.cs
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a juggernaut corpse" )]
|
||||
public class Juggernaut : BaseCreature
|
||||
{
|
||||
private bool m_Stunning;
|
||||
|
||||
[Constructable]
|
||||
public Juggernaut() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6 )
|
||||
{
|
||||
Name = "a blackthorn juggernaut";
|
||||
Body = 768;
|
||||
|
||||
|
||||
SetStr( 301, 400 );
|
||||
SetDex( 51, 70 );
|
||||
SetInt( 51, 100 );
|
||||
|
||||
SetHits( 181, 240 );
|
||||
|
||||
SetDamage( 12, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Fire, 25 );
|
||||
SetDamageType( ResistanceType.Energy, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 35, 45 );
|
||||
SetResistance( ResistanceType.Cold, 35, 45 );
|
||||
SetResistance( ResistanceType.Poison, 15, 25 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 90.1, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 140.1, 150.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
Fame = 12000;
|
||||
Karma = -12000;
|
||||
|
||||
VirtualArmor = 70;
|
||||
|
||||
if ( 0.1 > Utility.RandomDouble() )
|
||||
PackItem( new PowerCrystal() );
|
||||
|
||||
if ( 0.4 > Utility.RandomDouble() )
|
||||
PackItem( new ClockworkAssembly() );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( 0.05 > Utility.RandomDouble() )
|
||||
{
|
||||
if ( !IsParagon )
|
||||
{
|
||||
if ( 0.75 > Utility.RandomDouble() )
|
||||
c.DropItem( DawnsMusicGear.RandomCommon );
|
||||
else
|
||||
c.DropItem( DawnsMusicGear.RandomUncommon );
|
||||
}
|
||||
else
|
||||
c.DropItem( DawnsMusicGear.RandomRare );
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich );
|
||||
AddLoot( LootPack.Gems, 1 );
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x423;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x23B;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x140;
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override bool BardImmune{ get{ return !Core.AOS; } }
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( !m_Stunning && 0.3 > Utility.RandomDouble() )
|
||||
{
|
||||
m_Stunning = true;
|
||||
|
||||
defender.Animate( 21, 6, 1, true, false, 0 );
|
||||
this.PlaySound( 0xEE );
|
||||
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You have been stunned by a colossal blow!" );
|
||||
|
||||
BaseWeapon weapon = this.Weapon as BaseWeapon;
|
||||
if ( weapon != null )
|
||||
weapon.OnHit( this, defender );
|
||||
|
||||
if ( defender.Alive )
|
||||
{
|
||||
defender.Frozen = true;
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( Recover_Callback ), defender );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Recover_Callback( object state )
|
||||
{
|
||||
Mobile defender = state as Mobile;
|
||||
|
||||
if ( defender != null )
|
||||
{
|
||||
defender.Frozen = false;
|
||||
defender.Combatant = null;
|
||||
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You recover your senses." );
|
||||
}
|
||||
|
||||
m_Stunning = false;
|
||||
}
|
||||
|
||||
public Juggernaut( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
181
Scripts/Mobiles/Monsters/Humanoid/Melee/KhaldunRevenant.cs
Normal file
181
Scripts/Mobiles/Monsters/Humanoid/Melee/KhaldunRevenant.cs
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class KhaldunRevenant : BaseCreature
|
||||
{
|
||||
private static Hashtable m_Table = new Hashtable();
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );
|
||||
}
|
||||
|
||||
public static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
|
||||
{
|
||||
Mobile m = e.Mobile;
|
||||
Mobile lastKiller = m.LastKiller;
|
||||
|
||||
if ( lastKiller is BaseCreature )
|
||||
lastKiller = ((BaseCreature)lastKiller).GetMaster();
|
||||
|
||||
if ( IsInsideKhaldun( m ) && IsInsideKhaldun( lastKiller ) && lastKiller.Player && !m_Table.Contains( lastKiller ) )
|
||||
{
|
||||
foreach ( AggressorInfo ai in m.Aggressors )
|
||||
{
|
||||
if ( ai.Attacker == lastKiller && ai.CanReportMurder )
|
||||
{
|
||||
SummonRevenant( m, lastKiller );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void SummonRevenant( Mobile victim, Mobile killer )
|
||||
{
|
||||
KhaldunRevenant revenant = new KhaldunRevenant( killer );
|
||||
|
||||
revenant.MoveToWorld( victim.Location, victim.Map );
|
||||
revenant.Combatant = killer;
|
||||
revenant.FixedParticles( 0, 0, 0, 0x13A7, EffectLayer.Waist );
|
||||
Effects.PlaySound( revenant.Location, revenant.Map, 0x29 );
|
||||
|
||||
m_Table.Add( killer, null );
|
||||
}
|
||||
|
||||
public static bool IsInsideKhaldun( Mobile from )
|
||||
{
|
||||
return from != null && from.Region != null && from.Region.IsPartOf( "Khaldun" );
|
||||
}
|
||||
|
||||
private Mobile m_Target;
|
||||
private DateTime m_ExpireTime;
|
||||
|
||||
public override bool DeleteCorpseOnDeath{ get{ return true; } }
|
||||
|
||||
public override void DisplayPaperdollTo( Mobile to )
|
||||
{
|
||||
}
|
||||
|
||||
public override Mobile ConstantFocus{ get{ return m_Target; } }
|
||||
public override bool AlwaysAttackable{ get{ return true; } }
|
||||
|
||||
public KhaldunRevenant( Mobile target ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 )
|
||||
{
|
||||
Name = "a revenant";
|
||||
Body = 0x3CA;
|
||||
Hue = 0x41CE;
|
||||
|
||||
m_Target = target;
|
||||
m_ExpireTime = DateTime.UtcNow + TimeSpan.FromMinutes( 10.0 );
|
||||
|
||||
SetStr( 401, 500 );
|
||||
SetDex( 296, 315 );
|
||||
SetInt( 101, 200 );
|
||||
|
||||
SetHits( 241, 300 );
|
||||
SetStam( 242, 280 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 100.1, 150.0 );
|
||||
SetSkill( SkillName.Tactics, 90.1, 100.0 );
|
||||
SetSkill( SkillName.Swords, 140.1, 150.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 60, 70 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
Fame = 0;
|
||||
Karma = 0;
|
||||
|
||||
VirtualArmor = 60;
|
||||
|
||||
Halberd weapon = new Halberd();
|
||||
weapon.Hue = 0x41CE;
|
||||
weapon.Movable = false;
|
||||
|
||||
AddItem( weapon );
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x1BF;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x107;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0xFD;
|
||||
}
|
||||
|
||||
public override bool BardImmune{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
if ( !m_Target.Alive || DateTime.UtcNow > m_ExpireTime )
|
||||
{
|
||||
Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
//Combatant = m_Target;
|
||||
//FocusMob = m_Target;
|
||||
|
||||
if ( AIObject != null )
|
||||
AIObject.Action = ActionType.Combat;
|
||||
|
||||
base.OnThink();
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void OnDelete()
|
||||
{
|
||||
if ( m_Target != null )
|
||||
m_Table.Remove( m_Target );
|
||||
|
||||
base.OnDelete();
|
||||
}
|
||||
|
||||
public KhaldunRevenant( 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();
|
||||
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue