- Terrible Hatchlings quest fixed to only reward SE weapons and armor.

- Slayer and opposition systems now account for inheritance.
- Added Satyrs to the fey opposition group.
- Added fey slayer vulnerability to cu sidhes.
- Added reptilian and dragon slayer vulnerabilities to reptalons.
- Various mage AI additions for necromancers. (Spirit speak for healing, pain spike and strangle for damage, automatic mage/necro bias by skill value.)
- Fixed a targeting issue not accounting for FightMode.Evil versus low karma targeting.
- Added melee damage bonus for Talisman killer properties.
- Added general ML loot for ML areas.
- Added ML minor artifact drops for named ML mobs.
- Added named ML mobs for Bedlam.
This commit is contained in:
eos 2012-02-26 05:11:25 +00:00
parent a0bc5e2349
commit 43e5982fbb
22 changed files with 1207 additions and 231 deletions

View file

@ -9,6 +9,49 @@ namespace Server
public class Loot
{
#region List definitions
#region Mondain's Legacy
private static Type[] m_MLWeaponTypes = new Type[]
{
typeof( AssassinSpike ), typeof( DiamondMace ), typeof( ElvenMachete ),
typeof( ElvenSpellblade ), typeof( Leafblade ), typeof( OrnateAxe ),
typeof( RadiantScimitar ), typeof( RuneBlade ), typeof( WarCleaver ),
typeof( WildStaff )
};
public static Type[] MLWeaponTypes{ get{ return m_MLWeaponTypes; } }
private static Type[] m_MLRangedWeaponTypes = new Type[]
{
typeof( ElvenCompositeLongbow ), typeof( MagicalShortbow )
};
public static Type[] MLRangedWeaponTypes{ get{ return m_MLRangedWeaponTypes; } }
private static Type[] m_MLArmorTypes = new Type[]
{
typeof( Circlet ), typeof( GemmedCirclet ), typeof( LeafTonlet ),
typeof( RavenHelm ), typeof( RoyalCirclet ), typeof( VultureHelm ),
typeof( WingedHelm ), typeof( LeafArms ), typeof( LeafChest ),
typeof( LeafGloves ), typeof( LeafGorget ), typeof( LeafLegs ),
typeof( WoodlandArms ), typeof( WoodlandChest ), typeof( WoodlandGloves ),
typeof( WoodlandGorget ), typeof( WoodlandLegs ), typeof( HideChest ),
typeof( HideGloves ), typeof( HideGorget ), typeof( HidePants ),
typeof( HidePauldrons )
};
public static Type[] MLArmorTypes{ get{ return m_MLArmorTypes; } }
private static Type[] m_MLClothingTypes = new Type[]
{
typeof( MaleElvenRobe ), typeof( FemaleElvenRobe ), typeof( ElvenPants ),
typeof( ElvenShirt ), typeof( ElvenDarkShirt ), typeof( ElvenBoots ),
typeof( VultureHelm ), typeof( WoodlandBelt )
};
public static Type[] MLClothingTypes{ get{ return m_MLClothingTypes; } }
#endregion
private static Type[] m_SEWeaponTypes = new Type[]
{
typeof( Bokuto ), typeof( Daisho ), typeof( Kama ),
@ -224,19 +267,23 @@ namespace Server
private static Type[] m_PaladinScrollTypes = new Type[0];
private static Type[] m_ArcaneScrollTypes = new Type[]
#region Mondain's Legacy
private static Type[] m_ArcanistScrollTypes = new Type[]
{
typeof( ArcaneCircleScroll ), typeof ( GiftOfRenewalScroll ), typeof( ImmolatingWeaponScroll ), typeof( AttuneWeaponScroll ),
typeof( ThunderstormScroll ), typeof( NatureFuryScroll ), typeof( ReaperFormScroll ), typeof( WildfireScroll ),
typeof( EssenceOfWindScroll ), typeof( DryadAllureScroll ), typeof( EtherealVoyageScroll ), typeof( WordOfDeathScroll ),
typeof( GiftOfLifeScroll ), typeof( ArcaneEmpowermentScroll )
typeof( ArcaneCircleScroll ), typeof( GiftOfRenewalScroll ), typeof( ImmolatingWeaponScroll ), typeof( AttuneWeaponScroll ),
typeof( ThunderstormScroll ), typeof( NatureFuryScroll ), /*typeof( SummonFeyScroll ), typeof( SummonFiendScroll ),*/
typeof( ReaperFormScroll ), typeof( WildfireScroll ), typeof( EssenceOfWindScroll ), typeof( DryadAllureScroll ),
typeof( EtherealVoyageScroll ), typeof( WordOfDeathScroll ), typeof( GiftOfLifeScroll ), typeof( ArcaneEmpowermentScroll )
};
#endregion
public static Type[] RegularScrollTypes{ get{ return m_RegularScrollTypes; } }
public static Type[] NecromancyScrollTypes{ get{ return m_NecromancyScrollTypes; } }
public static Type[] SENecromancyScrollTypes{ get{ return m_SENecromancyScrollTypes; } }
public static Type[] PaladinScrollTypes{ get{ return m_PaladinScrollTypes; } }
public static Type[] ArcaneScrollTypes{ get{ return m_ArcaneScrollTypes; } }
#region Mondain's Legacy
public static Type[] ArcanistScrollTypes{ get{ return m_ArcanistScrollTypes; } }
#endregion
private static Type[] m_GrimmochJournalTypes = new Type[]
{
@ -371,11 +418,16 @@ namespace Server
public static BaseClothing RandomClothing()
{
return RandomClothing( false );
return RandomClothing( false, false );
}
public static BaseClothing RandomClothing( bool inTokuno )
public static BaseClothing RandomClothing( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLClothingTypes, m_AosClothingTypes, m_ClothingTypes ) as BaseClothing;
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEClothingTypes, m_AosClothingTypes, m_ClothingTypes ) as BaseClothing;
@ -387,11 +439,16 @@ namespace Server
public static BaseWeapon RandomRangedWeapon()
{
return RandomRangedWeapon( false );
return RandomRangedWeapon( false, false );
}
public static BaseWeapon RandomRangedWeapon( bool inTokuno )
public static BaseWeapon RandomRangedWeapon( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLRangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes ) as BaseWeapon;
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SERangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes ) as BaseWeapon;
@ -403,11 +460,16 @@ namespace Server
public static BaseWeapon RandomWeapon()
{
return RandomWeapon( false );
return RandomWeapon( false, false );
}
public static BaseWeapon RandomWeapon( bool inTokuno )
public static BaseWeapon RandomWeapon( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLWeaponTypes, m_AosWeaponTypes, m_WeaponTypes ) as BaseWeapon;
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEWeaponTypes, m_AosWeaponTypes, m_WeaponTypes ) as BaseWeapon;
@ -419,11 +481,16 @@ namespace Server
public static Item RandomWeaponOrJewelry()
{
return RandomWeaponOrJewelry( false );
return RandomWeaponOrJewelry( false, false );
}
public static Item RandomWeaponOrJewelry( bool inTokuno )
public static Item RandomWeaponOrJewelry( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_JewelryTypes );
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_JewelryTypes );
@ -440,11 +507,16 @@ namespace Server
public static BaseArmor RandomArmor()
{
return RandomArmor( false );
return RandomArmor( false, false );
}
public static BaseArmor RandomArmor( bool inTokuno )
public static BaseArmor RandomArmor( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLArmorTypes, m_ArmorTypes ) as BaseArmor;
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEArmorTypes, m_ArmorTypes ) as BaseArmor;
@ -469,11 +541,16 @@ namespace Server
public static Item RandomArmorOrHat()
{
return RandomArmorOrHat( false );
return RandomArmorOrHat( false, false );
}
public static Item RandomArmorOrHat( bool inTokuno )
public static Item RandomArmorOrHat( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLArmorTypes, m_ArmorTypes, m_AosHatTypes, m_HatTypes );
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEArmorTypes, m_ArmorTypes, m_SEHatTypes, m_AosHatTypes, m_HatTypes );
@ -493,11 +570,16 @@ namespace Server
public static BaseArmor RandomArmorOrShield()
{
return RandomArmorOrShield( false );
return RandomArmorOrShield( false, false );
}
public static BaseArmor RandomArmorOrShield( bool inTokuno )
public static BaseArmor RandomArmorOrShield( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLArmorTypes, m_ArmorTypes, m_AosShieldTypes, m_ShieldTypes ) as BaseArmor;
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEArmorTypes, m_ArmorTypes, m_AosShieldTypes, m_ShieldTypes ) as BaseArmor;
@ -509,11 +591,16 @@ namespace Server
public static Item RandomArmorOrShieldOrJewelry()
{
return RandomArmorOrShieldOrJewelry( false );
return RandomArmorOrShieldOrJewelry( false, false );
}
public static Item RandomArmorOrShieldOrJewelry( bool inTokuno )
public static Item RandomArmorOrShieldOrJewelry( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLArmorTypes, m_ArmorTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes, m_JewelryTypes );
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEArmorTypes, m_ArmorTypes, m_SEHatTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes, m_JewelryTypes );
@ -525,11 +612,16 @@ namespace Server
public static Item RandomArmorOrShieldOrWeapon()
{
return RandomArmorOrShieldOrWeapon( false );
return RandomArmorOrShieldOrWeapon( false, false );
}
public static Item RandomArmorOrShieldOrWeapon( bool inTokuno )
public static Item RandomArmorOrShieldOrWeapon( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_MLRangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes, m_MLArmorTypes, m_ArmorTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes );
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_SERangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes, m_SEArmorTypes, m_ArmorTypes, m_SEHatTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes );
@ -541,11 +633,16 @@ namespace Server
public static Item RandomArmorOrShieldOrWeaponOrJewelry()
{
return RandomArmorOrShieldOrWeaponOrJewelry( false );
return RandomArmorOrShieldOrWeaponOrJewelry( false, false );
}
public static Item RandomArmorOrShieldOrWeaponOrJewelry( bool inTokuno )
public static Item RandomArmorOrShieldOrWeaponOrJewelry( bool inTokuno, bool isMondain )
{
#region Mondain's Legacy
if ( Core.ML && isMondain )
return Construct( m_MLWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_MLRangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes, m_MLArmorTypes, m_ArmorTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes, m_JewelryTypes );
#endregion
if ( Core.SE && inTokuno )
return Construct( m_SEWeaponTypes, m_AosWeaponTypes, m_WeaponTypes, m_SERangedWeaponTypes, m_AosRangedWeaponTypes, m_RangedWeaponTypes, m_SEArmorTypes, m_ArmorTypes, m_SEHatTypes, m_AosHatTypes, m_HatTypes, m_AosShieldTypes, m_ShieldTypes, m_JewelryTypes );
@ -613,7 +710,7 @@ namespace Server
case SpellbookType.Regular: types = m_RegularScrollTypes; break;
case SpellbookType.Necromancer: types = (Core.SE ? m_SENecromancyScrollTypes : m_NecromancyScrollTypes ); break;
case SpellbookType.Paladin: types = m_PaladinScrollTypes; break;
case SpellbookType.Arcanist: types = m_ArcaneScrollTypes; break;
case SpellbookType.Arcanist: types = m_ArcanistScrollTypes; break;
}
return Construct( types, Utility.RandomMinMax( minIndex, maxIndex ) ) as SpellScroll;

View file

@ -501,6 +501,21 @@ namespace Server
{
new LootPackEntry( false, PotionItems, 100.00, 1 )
} );
/*
// TODO: Uncomment once added
#region Mondain's Legacy
public static readonly LootPackItem[] ParrotItem = new LootPackItem[]
{
new LootPackItem( typeof( ParrotItem ), 1 )
};
public static readonly LootPack Parrot = new LootPack( new LootPackEntry[]
{
new LootPackEntry( false, ParrotItem, 10.00, 1 )
} );
#endregion
*/
}
public class LootPackEntry
@ -561,6 +576,37 @@ namespace Server
return ( m.Map == Map.Tokuno );
}
#region Mondain's Legacy
private static bool IsMondain( Mobile m )
{
if ( m.Region.IsPartOf( "Twisted Weald" ) )
return true;
if ( m.Region.IsPartOf( "Sanctuary" ) )
return true;
if ( m.Region.IsPartOf( "Prism of Light" ) )
return true;
if ( m.Region.IsPartOf( "Citadel" ) )
return true;
if ( m.Region.IsPartOf( "Bedlam" ) )
return true;
if ( m.Region.IsPartOf( "Blighted Grove" ) )
return true;
if ( m.Region.IsPartOf( "Painted Caves" ) )
return true;
if ( m.Region.IsPartOf( "Palace of Paroxysmus" ) )
return true;
return false;
}
#endregion
public Item Construct( Mobile from, int luckChance, bool spawning )
{
if ( m_AtSpawnTime != spawning )
@ -578,7 +624,7 @@ namespace Server
LootPackItem item = m_Items[i];
if ( rnd < item.Chance )
return Mutate( from, luckChance, item.Construct( IsInTokuno( from ) ) );
return Mutate( from, luckChance, item.Construct( IsInTokuno( from ), IsMondain( from ) ) );
rnd -= item.Chance;
}
@ -850,18 +896,18 @@ namespace Server
return Loot.RandomScroll( minCircle * 8, (maxCircle * 8) + 7, SpellbookType.Regular );
}
public Item Construct( bool inTokuno )
public Item Construct( bool inTokuno, bool isMondain )
{
try
{
Item item;
if ( m_Type == typeof( BaseRanged ) )
item = Loot.RandomRangedWeapon( inTokuno );
item = Loot.RandomRangedWeapon( inTokuno, isMondain );
else if ( m_Type == typeof( BaseWeapon ) )
item = Loot.RandomWeapon( inTokuno );
item = Loot.RandomWeapon( inTokuno, isMondain );
else if ( m_Type == typeof( BaseArmor ) )
item = Loot.RandomArmorOrHat( inTokuno );
item = Loot.RandomArmorOrHat( inTokuno, isMondain );
else if ( m_Type == typeof( BaseShield ) )
item = Loot.RandomShield();
else if ( m_Type == typeof( BaseJewel ) )

View file

@ -1,10 +1,56 @@
using System;
using Server;
using Server.Items;
using Server.Mobiles;
namespace Server
{
public static class MondainsLegacy
{
public static Type[] Artifacts { get { return m_Artifacts; } }
private static Type[] m_Artifacts = new Type[]
{
typeof( AegisOfGrace ), typeof( BladeDance ), typeof( BloodwoodSpirit ), typeof( Bonesmasher ),
typeof( Boomstick ), typeof( BrightsightLenses ), typeof( FeyLeggings ), typeof( FleshRipper ),
typeof( HelmOfSwiftness ), typeof( PadsOfTheCuSidhe ), typeof( QuiverOfRage ), typeof( QuiverOfElements ),
typeof( RaedsGlory ), typeof( RighteousAnger ), typeof( RobeOfTheEclipse ), typeof( RobeOfTheEquinox ),
typeof( SoulSeeker ), typeof( TalonBite ), typeof( TotemOfVoid ), typeof( WildfireBow ),
typeof( Windsong )
};
public static bool CheckArtifactChance( Mobile m, BaseCreature bc )
{
if ( !Core.ML )
return false;
return Paragon.CheckArtifactChance( m, bc );
}
public static void GiveArtifactTo( Mobile m )
{
Item item = Activator.CreateInstance( m_Artifacts[Utility.Random( m_Artifacts.Length )] ) as Item;
if ( item == null )
return;
if ( m.AddToBackpack( item ) )
{
m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
m.SendLocalizedMessage( 1072223 ); // An item has been placed in your backpack.
}
else if ( m.BankBox.TryDropItem( m, item, false ) )
{
m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
m.SendLocalizedMessage( 1072224 ); // An item has been placed in your bank box.
}
else
{
// Item was placed at feet by m.AddToBackpack
m.SendLocalizedMessage( 1072523 ); // You find an artifact, but your backpack and bank are too full to hold it.
}
}
public static bool CheckML( Mobile from )
{
return CheckML( from, true );