- 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:
parent
a0bc5e2349
commit
43e5982fbb
22 changed files with 1207 additions and 231 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ) )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue