- Added more future ML craftables that already drop as loot to the special repair lists.

- Fixed Bloodwood Spirit and Totem of the Void sometimes not spawning with a protection attribute. (Prepatch ones are fixed on server start.)
- Fixed crashes in BaseTalisman resulting from setting Summoner to null.
- Paragon perks added to mobs dropping ML artifacts (by making them paragon "under the hood", seems to be the case on OSI as well). This also means the named mobs will now drop paragon chests.
- Poison immunity level is now also increased by 1 for paragons.
- Rend now drops ML minor artifacts.
- ML named mobs no longer use the AoS specific loot packs, but will adjust to the era the server is set in.
- The 'current speed' of paragons is now updated to account for the speed boost after spawning.
This commit is contained in:
eos 2012-03-11 01:43:55 +00:00
parent aacae9f7b8
commit c0206c6f7e
30 changed files with 197 additions and 126 deletions

View file

@ -119,7 +119,17 @@ namespace Server
typeof( DemonKnight ), typeof( GiantBlackWidow ), typeof( SummonedAirElemental ),
typeof( LesserHiryu ), typeof( Hiryu ), typeof( LadyOfTheSnow ),
typeof( RaiJu ), typeof( Ronin ), typeof( RuneBeetle ),
typeof( Changeling )
typeof( Changeling ),
#region ML named mobs - before Paragon speedboost
typeof( LadyJennifyr ), typeof( LadyMarai ), typeof( MasterJonath ),
typeof( MasterMikael ), typeof( MasterTheophilus ), typeof( RedDeath ),
typeof( SirPatrick ), typeof( Miasma ), typeof( Rend ),
typeof( Grobu ), typeof( Gnaw ), typeof( Guile ),
typeof( Irk ), typeof( Spite ), typeof( LadyLissith ),
typeof( LadySabrix ), typeof( Malefic ), typeof( Silk ),
typeof( Virulent )
// TODO: Where to put Lurg, Putrefier, Swoop and Pyre? They seem slower.
#endregion
} ),
/* Very Fast */
new SpeedInfo( 0.175, 0.350, new Type[]
@ -132,21 +142,7 @@ namespace Server
typeof( FactionHenchman ), typeof( FactionMercenary ), typeof( FactionNecromancer ),
typeof( FactionSorceress ), typeof( FactionWizard ), typeof( FactionBerserker ),
typeof( FactionPaladin ), typeof( Leviathan ), typeof( FireBeetle ),
typeof( FanDancer ),
#region ML named mobs
typeof( LadyJennifyr ), typeof( LadyMarai ), typeof( MasterJonath ),
typeof( MasterMikael ), typeof( MasterTheophilus ), typeof( RedDeath ),
typeof( SirPatrick ), typeof( Miasma ), typeof( Rend ),
typeof( Grobu ), typeof( Gnaw ), typeof( Guile ),
typeof( Irk ), typeof( Spite ), typeof( LadyLissith ),
typeof( LadySabrix ), typeof( Malefic ), typeof( Silk ),
typeof( Virulent )
/*
// These don't seem to be fast?
typeof( Lurg ), typeof( Putrefier ), typeof( Swoop),
typeof( Pyre )
*/
#endregion
typeof( FanDancer )
} ),
/* Medium */
new SpeedInfo( 0.25, 0.5, new Type[]

View file

@ -715,7 +715,7 @@ namespace Server.Mobiles
#endregion
#region Flee!!!
public virtual bool CanFlee{ get{ return ( !m_Paragon && !GivesMLMinorArtifact ); } }
public virtual bool CanFlee{ get{ return !m_Paragon; } }
private DateTime m_EndFlee;
@ -880,7 +880,7 @@ namespace Server.Mobiles
public override string ApplyNameSuffix( string suffix )
{
if ( IsParagon )
if ( IsParagon && !GivesMLMinorArtifact )
{
if ( suffix.Length == 0 )
suffix = "(Paragon)";
@ -1088,7 +1088,10 @@ namespace Server.Mobiles
if ( base.CheckPoisonImmunity( from, poison ) )
return true;
Poison p = this.PoisonImmune;
Poison p = PoisonImmune;
if ( m_Paragon )
p = PoisonImpl.IncreaseLevel( p );
return ( p != null && p.Level >= poison.Level );
}
@ -2780,13 +2783,15 @@ namespace Server.Mobiles
if ( m_Paragon )
p = PoisonImpl.IncreaseLevel( p );
if ( p != null && HitPoisonChance >= Utility.RandomDouble() ) {
if ( p != null && HitPoisonChance >= Utility.RandomDouble() )
{
defender.ApplyPoison( this, p );
if ( this.Controlled )
this.CheckSkill(SkillName.Poisoning, 0, this.Skills[SkillName.Poisoning].Cap);
if ( Controlled )
CheckSkill( SkillName.Poisoning, 0, Skills[SkillName.Poisoning].Cap );
}
if( AutoDispel && defender is BaseCreature && ((BaseCreature)defender).IsDispellable && AutoDispelChance > Utility.RandomDouble() )
if ( AutoDispel && defender is BaseCreature && ((BaseCreature)defender).IsDispellable && AutoDispelChance > Utility.RandomDouble() )
Dispel( defender );
}
@ -4493,13 +4498,18 @@ namespace Server.Mobiles
public virtual void OnKilledBy( Mobile mob )
{
if ( m_Paragon && Paragon.CheckArtifactChance( mob, this ) )
Paragon.GiveArtifactTo( mob );
#region Mondain's Legacy
if ( GivesMLMinorArtifact && MondainsLegacy.CheckArtifactChance( mob, this ) )
MondainsLegacy.GiveArtifactTo( mob );
if ( GivesMLMinorArtifact )
{
if ( MondainsLegacy.CheckArtifactChance( mob, this ) )
MondainsLegacy.GiveArtifactTo( mob );
}
#endregion
else if ( m_Paragon )
{
if ( Paragon.CheckArtifactChance( mob, this ) )
Paragon.GiveArtifactTo( mob );
}
}
public override void OnDeath( Container c )

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
[Constructable]
public LadyJennifyr()
{
IsParagon = true;
Name = "Lady Jennifyr";
Hue = 0x76D;
@ -42,7 +44,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override void OnGaveMeleeAttack( Mobile defender )

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
[Constructable]
public LadyMarai()
{
IsParagon = true;
Name = "Lady Marai";
Hue = 0x21;
@ -42,7 +44,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public MasterJonath()
{
IsParagon = true;
Name = "Master Jonath";
Hue = 0x455;
@ -52,7 +54,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
// TODO: Special move?

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public MasterMikael()
{
IsParagon = true;
Name = "Master Mikael";
Hue = 0x8FD;
@ -51,7 +53,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
// TODO: Special move?

View file

@ -10,8 +10,11 @@ namespace Server.Mobiles
[Constructable]
public MasterTheophilus()
{
IsParagon = true;
Name = "Master Theophilus";
Title = "the necromancer";
Hue = 0;
SetStr( 137, 187 );
SetDex( 253, 301 );
@ -59,7 +62,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()
@ -67,17 +70,6 @@ namespace Server.Mobiles
return WeaponAbility.ParalyzingBlow;
}
/*
// TODO: Needs verification
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Paragon.ChestChance > Utility.RandomDouble() )
c.DropItem( new ParagonChest( Name, TreasureMapLevel ) );
}
*/
public override bool GivesMLMinorArtifact{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 5; } }

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
public RedDeath()
: base( "Red Death" )
{
IsParagon = true;
Hue = 0x21;
BaseSoundID = 0x1C3;
@ -51,7 +53,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -12,6 +12,8 @@ namespace Server.Mobiles
[Constructable]
public SirPatrick()
{
IsParagon = true;
Name = "Sir Patrick";
Hue = 0x47E;
@ -43,7 +45,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnGaveMeleeAttack( Mobile defender )

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Miasma()
{
IsParagon = true;
Name = "Miasma";
Hue = 0x8FD;
@ -38,13 +40,11 @@ namespace Server.Mobiles
Fame = 21000;
Karma = -21000;
Tamable = false;
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override WeaponAbility GetWeaponAbility()
@ -80,16 +80,11 @@ namespace Server.Mobiles
case 15: c.DropItem( new HunterLegs() ); break;
}
}
if ( Paragon.ChestChance > Utility.RandomDouble() )
c.DropItem( new ParagonChest( Name, TreasureMapLevel ) );
}
*/
public override bool GivesMLMinorArtifact{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 5; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public Miasma( Serial serial )
: base( serial )

View file

@ -13,6 +13,8 @@ namespace Server.Mobiles
[Constructable]
public Pyre()
{
IsParagon = true;
Name = "Pyre";
Hue = 0x489;
@ -48,7 +50,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Rend()
{
IsParagon = true;
Name = "Rend";
Hue = 0x455;
@ -38,19 +40,11 @@ namespace Server.Mobiles
Fame = 21000;
Karma = -21000;
Tamable = false;
/*
// TODO: Needs verification
if ( Paragon.ChestChance > Utility.RandomDouble() )
PackItem( new ParagonChest( Name, TreasureMapLevel ) );
*/
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()
@ -61,6 +55,8 @@ namespace Server.Mobiles
return WeaponAbility.BleedAttack;
}
public override bool GivesMLMinorArtifact{ get{ return true; } }
public Rend( Serial serial )
: base( serial )
{

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Grobu()
{
IsParagon = true;
Name = "Grobu";
Hue = 0x455;
@ -40,13 +42,11 @@ namespace Server.Mobiles
Fame = 1000;
Karma = 1000;
Tamable = false;
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosFilthyRich, 3 );
AddLoot( LootPack.FilthyRich, 2 );
}
/*

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Lurg()
{
IsParagon = true;
Name = "Lurg";
Hue = 0x455;
@ -39,16 +41,11 @@ namespace Server.Mobiles
Fame = 10000;
Karma = -10000;
/*
if ( Paragon.ChestChance > Utility.RandomDouble() ) // TODO: Needs verification
PackItem( new ParagonChest( Name, TreasureMapLevel ) );
*/
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Putrefier()
{
IsParagon = true;
Name = "Putrefier";
Hue = 63;
@ -41,13 +43,16 @@ namespace Server.Mobiles
SetSkill( SkillName.Meditation, 41.4, 85.0 );
SetSkill( SkillName.Poisoning, 45.0, 50.0 );
Fame = 24000;
Karma = -24000;
PackScroll( 4, 7 );
PackScroll( 4, 7 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
/*
@ -60,15 +65,11 @@ namespace Server.Mobiles
if ( Utility.RandomDouble() < 0.6 )
c.DropItem( new ParrotItem() );
if ( Paragon.ChestChance > Utility.RandomDouble() )
c.DropItem( new ParagonChest( Name, TreasureMapLevel ) );
}
*/
public override bool GivesMLMinorArtifact{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Deadly; } } // Becomes Lethal with Paragon bonus
public override int TreasureMapLevel{ get{ return 5; } }
public Putrefier( Serial serial )

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Gnaw()
{
IsParagon = true;
Name = "Gnaw";
Hue = 0x130;
@ -37,13 +39,11 @@ namespace Server.Mobiles
Fame = 17500;
Karma = -17500;
Tamable = false;
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosFilthyRich, 3 );
AddLoot( LootPack.FilthyRich, 2 );
}
public override bool GivesMLMinorArtifact{ get{ return true; } }

View file

@ -13,6 +13,10 @@ namespace Server.Mobiles
[Constructable]
public Guile()
{
IsParagon = true;
Hue = DefaultHue;
SetStr( 53, 214 );
SetDex( 243, 367 );
SetInt( 369, 586 );
@ -61,7 +65,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public Guile( Serial serial )

View file

@ -13,6 +13,10 @@ namespace Server.Mobiles
[Constructable]
public Irk()
{
IsParagon = true;
Hue = DefaultHue;
SetStr( 23, 183 );
SetDex( 259, 360 );
SetInt( 374, 600 );
@ -46,7 +50,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
/*

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
[Constructable]
public LadyLissith()
{
IsParagon = true;
Name = "Lady Lissith";
Hue = 0x452;
@ -44,7 +46,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public LadySabrix()
{
IsParagon = true;
Name = "Lady Sabrix";
Hue = 0x497;
@ -43,7 +45,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Malefic()
{
IsParagon = true;
Name = "Malefic";
Hue = 0x455;
@ -51,7 +53,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Silk()
{
IsParagon = true;
Name = "Silk";
Hue = 0x47E;
@ -43,7 +45,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override WeaponAbility GetWeaponAbility()
@ -52,8 +54,6 @@ namespace Server.Mobiles
}
public override bool GivesMLMinorArtifact{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public Silk( Serial serial )
: base( serial )

View file

@ -13,6 +13,10 @@ namespace Server.Mobiles
[Constructable]
public Spite()
{
IsParagon = true;
Hue = DefaultHue;
SetStr( 53, 214 );
SetDex( 243, 367 );
SetInt( 369, 586 );
@ -44,7 +48,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
public override bool GivesMLMinorArtifact{ get{ return true; } }

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
[Constructable]
public Swoop()
{
IsParagon = true;
Name = "Swoop";
Hue = 0xE0;
@ -39,15 +41,13 @@ namespace Server.Mobiles
Fame = 18000;
Karma = 0;
Tamable = false;
PackReg( 4 );
PackArcaneScroll( 0, 1 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 3 );
AddLoot( LootPack.UltraRich, 2 );
}
// TODO: Put this attack shared with Hiryu and Lesser Hiryu in one place

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
[Constructable]
public Virulent()
{
IsParagon = true;
Name = "Virulent";
Hue = 0x8FD;
@ -45,7 +47,7 @@ namespace Server.Mobiles
public override void GenerateLoot()
{
AddLoot( LootPack.AosUltraRich, 4 );
AddLoot( LootPack.UltraRich, 3 );
}
public override WeaponAbility GetWeaponAbility()

View file

@ -14,7 +14,7 @@ namespace Server.Mobiles
public static Type[] Artifacts = new Type[]
{
typeof( GoldBricks ), typeof( PhillipsWoodenSteed ),
typeof( GoldBricks ), typeof( PhillipsWoodenSteed ),
typeof( AlchemistsBauble ), typeof( ArcticDeathDealer ),
typeof( BlazeOfDeath ), typeof( BowOfTheJukaKing ),
typeof( BurglarsBandana ), typeof( CavortingClub ),
@ -23,13 +23,13 @@ namespace Server.Mobiles
typeof( NightsKiss ), typeof( NoxRangersHeavyCrossbow ),
typeof( OrcishVisage ), typeof( PolarBearMask ),
typeof( ShieldOfInvulnerability ), typeof( StaffOfPower ),
typeof( VioletCourage ), typeof( HeartOfTheLion ),
typeof( WrathOfTheDryad ), typeof( PixieSwatter ),
typeof( VioletCourage ), typeof( HeartOfTheLion ),
typeof( WrathOfTheDryad ), typeof( PixieSwatter ),
typeof( GlovesOfThePugilist )
};
public static int Hue = 0x501; // Paragon hue
// Buffs
public static double HitsBuff = 5.0;
public static double StrBuff = 1.05;
@ -50,7 +50,7 @@ namespace Server.Mobiles
if ( bc.HitsMaxSeed >= 0 )
bc.HitsMaxSeed = (int)( bc.HitsMaxSeed * HitsBuff );
bc.RawStr = (int)( bc.RawStr * StrBuff );
bc.RawInt = (int)( bc.RawInt * IntBuff );
bc.RawDex = (int)( bc.RawDex * DexBuff );
@ -69,6 +69,7 @@ namespace Server.Mobiles
bc.PassiveSpeed /= SpeedBuff;
bc.ActiveSpeed /= SpeedBuff;
bc.CurrentSpeed = bc.PassiveSpeed;
bc.DamageMin += DamageBuff;
bc.DamageMax += DamageBuff;
@ -99,7 +100,7 @@ namespace Server.Mobiles
if ( bc.HitsMaxSeed >= 0 )
bc.HitsMaxSeed = (int)( bc.HitsMaxSeed / HitsBuff );
bc.RawStr = (int)( bc.RawStr / StrBuff );
bc.RawInt = (int)( bc.RawInt / IntBuff );
bc.RawDex = (int)( bc.RawDex / DexBuff );
@ -115,9 +116,10 @@ namespace Server.Mobiles
if ( skill.Base > 0.0 )
skill.Base /= SkillsBuff;
}
bc.PassiveSpeed *= SpeedBuff;
bc.ActiveSpeed *= SpeedBuff;
bc.CurrentSpeed = bc.PassiveSpeed;
bc.DamageMin -= DamageBuff;
bc.DamageMax -= DamageBuff;
@ -141,7 +143,7 @@ namespace Server.Mobiles
if ( Array.IndexOf( Maps, m ) == -1 )
return false;
if ( bc is BaseChampion || bc is Harrower || bc is BaseVendor || bc is BaseEscortable || bc is Clone || bc.GivesMLMinorArtifact )
if ( bc is BaseChampion || bc is Harrower || bc is BaseVendor || bc is BaseEscortable || bc is Clone || bc.IsParagon )
return false;
int fame = bc.Fame;