ML quest system; first SVN release.

Secondary changes:
- Region fixes, mainly for New Haven.
- Recipe system changes.
- Enabled ML craftables.
- Dyeing/cutting restrictions for quest items.
- Moved IsInvulnerable from BaseVendor to BaseCreature.
- Moved RandomBrightHue to Utility.
- Items no longer decay when attached to a spawner.
- Quest item hue is now faked through packets, instead of overriding Hue.
- Re-enabled item drag effects for SA clients.
- Fixed AssignRandomFacialHair bug in Utility.
- Added random hue comments to Utility.
This commit is contained in:
eos 2013-02-03 01:05:17 +00:00
parent 5c7af18dfb
commit 35fbffdb51
167 changed files with 23218 additions and 234 deletions

View file

@ -65,6 +65,14 @@ namespace Server.Mobiles
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 );

View file

@ -59,6 +59,15 @@ namespace Server.Mobiles
PackItem( Loot.RandomNecromancyReagent() );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
// TODO: Check drop rate
if ( Utility.RandomDouble() < 0.05 )
c.DropItem( new StoutWhip() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager, 2 );

View file

@ -0,0 +1,79 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an Abscess corpse" )]
public class Abscess : Hydra
{
[Constructable]
public Abscess()
{
IsParagon = true;
Name = "Abscess";
Hue = 0x8FD;
SetStr( 845, 871 );
SetDex( 121, 134 );
SetInt( 124, 142 );
SetHits( 7470, 7540 );
SetDamage( 26, 31 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Cold, 10 );
SetDamageType( ResistanceType.Poison, 10 );
SetDamageType( ResistanceType.Energy, 10 );
SetResistance( ResistanceType.Physical, 65, 75 );
SetResistance( ResistanceType.Fire, 70, 80 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 45 );
SetResistance( ResistanceType.Energy, 35, 45 );
SetSkill( SkillName.Wrestling, 132.3, 143.8 );
SetSkill( SkillName.Tactics, 121.0, 130.5 );
SetSkill( SkillName.MagicResist, 102.9, 119.0 );
SetSkill( SkillName.Anatomy, 91.8, 94.3 );
// TODO: Fame/Karma
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 4 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new AbscessTail() );
}
public override bool GivesMLMinorArtifact { get { return true; } }
public Abscess( 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();
}
}
}

View file

@ -0,0 +1,106 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a Coil corpse" )]
public class Coil : SilverSerpent
{
// TODO: Check faction allegiance
[Constructable]
public Coil()
{
IsParagon = true;
Name = "Coil";
Hue = 0x3F;
SetStr( 205, 343 );
SetDex( 202, 283 );
SetInt( 88, 142 );
SetHits( 628, 1291 );
SetDamage( 19, 28 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 56, 62 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 25, 30 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.Wrestling, 124.5, 141.3 );
SetSkill( SkillName.Tactics, 130.2, 142.0 );
SetSkill( SkillName.MagicResist, 102.3, 113.0 );
SetSkill( SkillName.Anatomy, 120.8, 138.1 );
SetSkill( SkillName.Poisoning, 110.1, 133.4 );
// TODO: Fame/Karma
PackGem( 2 );
PackItem( new Bone() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.MortalStrike;
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new CoilsFang() );
/*
// TODO: uncomment once added
if ( Utility.RandomDouble() < 0.025 )
{
switch ( Utility.Random( 5 ) )
{
case 0: c.DropItem( new AssassinChest() ); break;
case 1: c.DropItem( new DeathGloves() ); break;
case 2: c.DropItem( new LeafweaveLegs() ); break;
case 3: c.DropItem( new HunterLegs() ); break;
case 4: c.DropItem( new MyrmidonLegs() ); break;
}
}
*/
}
public override Poison HitPoison { get { return Poison.Lethal; } }
public override Poison PoisonImmune { get { return Poison.Lethal; } }
public override bool GivesMLMinorArtifact { get { return true; } }
public override int Hides { get { return 48; } }
public override int Meat { get { return 1; } }
public Coil( 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();
}
}
}

View file

@ -0,0 +1,46 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an enslaved satyr corpse" )]
public class EnslavedSatyr : Satyr
{
[Constructable]
public EnslavedSatyr()
{
Name = "an enslaved satyr";
}
/*
// TODO: uncomment once added
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.1 )
c.DropItem( new ParrotItem() );
}
*/
public EnslavedSatyr( 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();
}
}
}

View file

@ -0,0 +1,91 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a hydra corpse" )]
public class Hydra : BaseCreature
{
[Constructable]
public Hydra()
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a hydra";
Body = 0x109;
BaseSoundID = 0x16A;
SetStr( 801, 828 );
SetDex( 102, 118 );
SetInt( 102, 120 );
SetHits( 1480, 1500 );
SetDamage( 21, 26 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Cold, 10 );
SetDamageType( ResistanceType.Poison, 10 );
SetDamageType( ResistanceType.Energy, 10 );
SetResistance( ResistanceType.Physical, 65, 75 );
SetResistance( ResistanceType.Fire, 70, 85 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 43 );
SetResistance( ResistanceType.Energy, 36, 45 );
SetSkill( SkillName.Wrestling, 103.5, 117.4 );
SetSkill( SkillName.Tactics, 100.1, 109.8 );
SetSkill( SkillName.MagicResist, 85.5, 98.5 );
SetSkill( SkillName.Anatomy, 75.4, 79.8 );
// TODO: Fame/Karma
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 3 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new HydraScale() );
/*
// TODO: uncomment once added
if ( Utility.RandomDouble() < 0.2 )
c.DropItem( new ParrotItem() );
if ( Utility.RandomDouble() < 0.05 )
c.DropItem( new ThorvaldsMedallion() );
*/
}
public override bool HasBreath { get { return true; } }
public override int Hides { get { return 40; } }
public override int Meat { get { return 19; } }
public override int TreasureMapLevel { get { return 5; } }
public Hydra( 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();
}
}
}

View file

@ -0,0 +1,50 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an insane dryad corpse" )]
public class InsaneDryad : MLDryad
{
public override bool InitialInnocent { get { return false; } }
[Constructable]
public InsaneDryad()
{
Name = "an insane dryad";
// TODO: Perhaps these should have negative karma?
}
/*
// TODO: uncomment once added
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.1 )
c.DropItem( new ParrotItem() );
}
*/
public InsaneDryad( 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();
}
}
}

View file

@ -0,0 +1,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a Saliva corpse" )]
public class Saliva : Harpy
{
[Constructable]
public Saliva()
{
// TODO: Not a paragon? No ML arties?
// It moves like a paragon on OSI...
Name = "Saliva";
Hue = 0x11E;
SetStr( 110, 206 );
SetDex( 123, 222 );
SetInt( 80, 127 );
SetHits( 409, 842 );
SetDamage( 20, 22 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 46, 48 );
SetResistance( ResistanceType.Fire, 32, 40 );
SetResistance( ResistanceType.Cold, 34, 49 );
SetResistance( ResistanceType.Poison, 40, 48 );
SetResistance( ResistanceType.Energy, 35, 39 );
SetSkill( SkillName.Wrestling, 106.4, 128.8 );
SetSkill( SkillName.Tactics, 129.9, 141.0 );
SetSkill( SkillName.MagicResist, 84.3, 105.0 );
// TODO: Fame/Karma?
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new SalivasFeather() );
// TODO: uncomment once added
//if ( Utility.RandomDouble() < 0.1 )
// c.DropItem( new ParrotItem() );
}
public Saliva( 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();
}
}
}

View file

@ -0,0 +1,78 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a Tangle corpse" )]
public class Tangle : BogThing
{
[Constructable]
public Tangle()
{
// TODO: Not a paragon? No ML arties?
// It moves like a paragon on OSI...
Name = "Tangle";
Hue = 0x21;
SetStr( 870, 940 );
SetDex( 58, 74 );
SetInt( 46, 58 );
SetHits( 2468, 2733 );
SetMana( 8, 12 );
SetDamage( 15, 28 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Poison, 40 );
SetResistance( ResistanceType.Physical, 50, 57 );
SetResistance( ResistanceType.Fire, 40, 43 );
SetResistance( ResistanceType.Cold, 30, 35 );
SetResistance( ResistanceType.Poison, 61, 69 );
SetResistance( ResistanceType.Energy, 41, 45 );
SetSkill( SkillName.Wrestling, 77.8, 94.6 );
SetSkill( SkillName.Tactics, 90.6, 100.4 );
SetSkill( SkillName.MagicResist, 108.4, 114.0 );
// TODO: Fame/Karma?
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 3 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.3 )
c.DropItem( new TaintedSeeds() );
}
public override Poison PoisonImmune { get { return Poison.Lethal; } }
public Tangle( 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();
}
}
}

View file

@ -0,0 +1,81 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a Thrasher corpse" )]
public class Thrasher : Alligator
{
[Constructable]
public Thrasher()
{
IsParagon = true;
Name = "Thrasher";
Hue = 0x497;
SetStr( 93, 327 );
SetDex( 7, 201 );
SetInt( 15, 67 );
SetHits( 260, 984 );
SetStam( 56, 75 );
SetMana( 25, 30 );
SetDamage( 20, 30 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 55 );
SetResistance( ResistanceType.Fire, 25, 29 );
SetResistance( ResistanceType.Poison, 25, 28 );
SetSkill( SkillName.Wrestling, 101.2, 118.3 );
SetSkill( SkillName.Tactics, 96.3, 117.3 );
SetSkill( SkillName.MagicResist, 102.4, 118.6 );
// TODO: Fame/Karma
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 4 );
}
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.ArmorIgnore;
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new ThrashersTail() );
}
public override bool GivesMLMinorArtifact { get { return true; } }
public override int Hides { get { return 48; } }
public override int Meat { get { return 1; } }
public Thrasher( 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();
}
}
}

View file

@ -54,6 +54,14 @@ namespace Server.Mobiles
AddLoot( LootPack.Rich ); // Need to verify
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.1 )
c.DropItem( new PrimitiveFetish() );
}
public Troglodyte( Serial serial ) : base( serial )
{
}