From 1d74d05af4f8e7df04be516a045902ad3cac6f3c Mon Sep 17 00:00:00 2001 From: xavier Date: Mon, 15 Mar 2010 15:28:44 +0000 Subject: [PATCH] Housing - house commit has inappropiate cost for certain parts http://www.uodemise.com/forum/showthread.php?t=136453 - houses should not be placable on roads http://www.uodemise.com/forum/showthread.php?t=139597 Bushido - lightning strike should consume extra mana if player walks http://www.uodemise.com/forum/showthread.php?t=127699 Weapons - frenzied whirlwind should properly flag combatants. http://www.uodemise.com/forum/showthread.php?t=138625 Magery - PolyMorph should not turn the caster grey/criminal http://www.uodemise.com/forum/showthread.php?t=116438 - Paralyze should interfere in casting paladin spells. http://www.uodemise.com/forum/showthread.php?t=120742 Spellweaving - Ethereal Voyage should not break when attempting to tame dragons, nightmares, etc. http://www.uodemise.com/forum/showthread.php?t=135349 Misc - refactor DrawRessource() to DrawResource() http://www.uodemise.com/forum/showthread.php?t=127202 - random blood "spatter" itemid during combat: more visible blood. http://www.uodemise.com/forum/showthread.php?t=140092 Taming - Animal lore should check for skill modifiers when using lore on mobiles. http://www.uodemise.com/forum/showthread.php?t=140658 Necromany - Wraithform should allow push-through without stam loss always. http://www.uodemise.com/forum/showthread.php?t=117126 - Wraithform mana leech should not lower the victim's mana + small cleanup to spellhelper.doleech() http://www.uodemise.com/forum/showthread.php?t=120238 Chivalry - Noble Sacrifice should work in houses. RunUO's does not. http://www.uodemise.com/forum/showthread.php?t=122819 NCP Vendors - Add necro regs for vendors to buy from players. http://www.uodemise.com/forum/showthread.php?t=136435 --- Scripts/Engines/Craft/Core/CraftGumpItem.cs | 4 +- Scripts/Engines/Craft/DefBlacksmithy.cs | 10 +-- Scripts/Items/Misc/Blood.cs | 2 +- .../Weapons/Abilities/FrenziedWhirlwind.cs | 1 + Scripts/Misc/Notoriety.cs | 2 +- Scripts/Mobiles/PlayerMobile.cs | 72 ++++++++++++++++++- Scripts/Mobiles/Vendors/SBInfo/SBMage.cs | 10 +++ Scripts/Multis/HouseFoundation.cs | 16 +++-- Scripts/Multis/HousePlacement.cs | 25 +++---- Scripts/Skills/AnimalLore.cs | 4 +- Scripts/Skills/AnimalTaming.cs | 4 +- Scripts/Spells/Base/SpellHelper.cs | 29 ++++---- Scripts/Spells/Bushido/LightningStrike.cs | 47 +++++++----- Scripts/Spells/Chivalry/NobleSacrifice.cs | 5 +- Scripts/Spells/Fifth/Paralyze.cs | 3 +- Scripts/Spells/Necromancy/WraithForm.cs | 10 +++ 16 files changed, 175 insertions(+), 69 deletions(-) diff --git a/Scripts/Engines/Craft/Core/CraftGumpItem.cs b/Scripts/Engines/Craft/Core/CraftGumpItem.cs index 4bc44a15d..0c5e63e19 100644 --- a/Scripts/Engines/Craft/Core/CraftGumpItem.cs +++ b/Scripts/Engines/Craft/Core/CraftGumpItem.cs @@ -85,7 +85,7 @@ namespace Server.Engines.Craft DrawItem(); DrawSkill(); - DrawRessource(); + DrawResource(); /* if( craftItem.RequiresSE ) @@ -180,7 +180,7 @@ namespace Server.Engines.Craft private static Type typeofBlankScroll = typeof( BlankScroll ); private static Type typeofSpellScroll = typeof( SpellScroll ); - public void DrawRessource() + public void DrawResource() { bool retainedColor = false; diff --git a/Scripts/Engines/Craft/DefBlacksmithy.cs b/Scripts/Engines/Craft/DefBlacksmithy.cs index bd694f3df..9ca1bd07c 100644 --- a/Scripts/Engines/Craft/DefBlacksmithy.cs +++ b/Scripts/Engines/Craft/DefBlacksmithy.cs @@ -187,18 +187,18 @@ namespace Server.Engines.Craft { /* Synthax for a SIMPLE craft item - AddCraft( ObjectType, Group, MinSkill, MaxSkill, RessourceType, Amount, Message ) + AddCraft( ObjectType, Group, MinSkill, MaxSkill, ResourceType, Amount, Message ) ObjectType : The type of the object you want to add to the build list. Group : The group in wich the object will be showed in the craft menu. MinSkill : The minimum of skill value MaxSkill : The maximum of skill value - RessourceType : The type of the ressource the mobile need to create the item - Amount : The amount of the RessourceType it need to create the item - Message : String or Int for Localized. The message that will be sent to the mobile, if the specified ressource is missing. + ResourceType : The type of the resource the mobile need to create the item + Amount : The amount of the ResourceType it need to create the item + Message : String or Int for Localized. The message that will be sent to the mobile, if the specified resource is missing. Synthax for a COMPLEXE craft item. A complexe item is an item that need either more than - only one skill, or more than only one ressource. + only one skill, or more than only one resource. Coming soon.... */ diff --git a/Scripts/Items/Misc/Blood.cs b/Scripts/Items/Misc/Blood.cs index 52f57088c..d8d6457d0 100644 --- a/Scripts/Items/Misc/Blood.cs +++ b/Scripts/Items/Misc/Blood.cs @@ -6,7 +6,7 @@ namespace Server.Items public class Blood : Item { [Constructable] - public Blood() : this( 0x1645 ) + public Blood() : this( Utility.RandomList( 0x1645, 0x122A, 0x122B, 0x122C, 0x122D, 0x122E, 0x122F )) { } diff --git a/Scripts/Items/Weapons/Abilities/FrenziedWhirlwind.cs b/Scripts/Items/Weapons/Abilities/FrenziedWhirlwind.cs index 48e979f8c..f20e876a8 100644 --- a/Scripts/Items/Weapons/Abilities/FrenziedWhirlwind.cs +++ b/Scripts/Items/Weapons/Abilities/FrenziedWhirlwind.cs @@ -86,6 +86,7 @@ namespace Server.Items for( int i = 0; i < targets.Count; ++i ) { Mobile m = (Mobile)targets[i]; + attacker.DoHarmful( m, true ); Timer t = Registry[m] as Timer; diff --git a/Scripts/Misc/Notoriety.cs b/Scripts/Misc/Notoriety.cs index 12e43f6c1..1c3bf0af0 100644 --- a/Scripts/Misc/Notoriety.cs +++ b/Scripts/Misc/Notoriety.cs @@ -329,7 +329,7 @@ namespace Server.Misc if( !(target is BaseCreature && ((BaseCreature)target).InitialInnocent) ) { - if( !target.Body.IsHuman && !target.Body.IsGhost && !IsPet( target as BaseCreature ) && !TransformationSpellHelper.UnderTransformation( target ) && !AnimalForm.UnderTransformation( target ) ) + if( !target.Body.IsHuman && !target.Body.IsGhost && !IsPet( target as BaseCreature ) && !(target is PlayerMobile) || !Core.ML && !target.CanBeginAction( typeof( Server.Spells.Seventh.PolymorphSpell ) ) ) return Notoriety.CanBeAttacked; } diff --git a/Scripts/Mobiles/PlayerMobile.cs b/Scripts/Mobiles/PlayerMobile.cs index 5f1f47501..da2a7f5a1 100644 --- a/Scripts/Mobiles/PlayerMobile.cs +++ b/Scripts/Mobiles/PlayerMobile.cs @@ -105,7 +105,14 @@ namespace Server.Mobiles private int m_StepsTaken; private int m_Profession; private bool m_IsStealthing; // IsStealthing should be moved to Server.Mobiles + private bool m_IgnoreMobiles; // IgnoreMobiles should be moved to Server.Mobiles + /* + * a value of zero means, that the mobile is not executing the spell. Otherwise, + * the value should match the BaseMana required + */ + private int m_ExecutesLightningStrike; // move to Server.Mobiles?? + private DateTime m_LastOnline; private Server.Guilds.RankDefinition m_GuildRank; @@ -173,6 +180,23 @@ namespace Server.Mobiles set { m_IsStealthing = value; } } + [CommandProperty( AccessLevel.GameMaster )] + public bool IgnoreMobiles // IgnoreMobiles should be moved to Server.Mobiles + { + get + { + return m_IgnoreMobiles; + } + set + { + if( m_IgnoreMobiles != value ) + { + m_IgnoreMobiles = value; + Delta( MobileDelta.Flags ); + } + } + } + [CommandProperty( AccessLevel.GameMaster )] public NpcGuild NpcGuild { @@ -219,6 +243,12 @@ namespace Server.Mobiles set { m_ToTTotalMonsterFame = value; } } + public int ExecutesLightningStrike + { + get { return m_ExecutesLightningStrike; } + set { m_ExecutesLightningStrike = value; } + } + #endregion #region PlayerFlags @@ -506,6 +536,26 @@ namespace Server.Mobiles return true; } + + public override int GetPacketFlags() + { + int flags = base.GetPacketFlags(); + + if ( m_IgnoreMobiles ) + flags |= 0x10; + + return flags; + } + + public override int GetOldPacketFlags() + { + int flags = base.GetOldPacketFlags(); + + if ( m_IgnoreMobiles ) + flags |= 0x10; + + return flags; + } public bool GetFlag( PlayerFlag flag ) { @@ -632,6 +682,18 @@ namespace Server.Mobiles return min; } + public override void OnManaChange(int oldValue) + { + base.OnManaChange(oldValue); + if (m_ExecutesLightningStrike > 0) + { + if (Mana < m_ExecutesLightningStrike) + { + LightningStrike.ClearCurrentMove(this); + } + } + } + private static void OnLogin( LoginEventArgs e ) { Mobile from = e.Mobile; @@ -1860,7 +1922,7 @@ namespace Server.Mobiles public override bool CheckShove( Mobile shoved ) { - if( TransformationSpellHelper.UnderTransformation( this, typeof( WraithFormSpell ) ) ) + if( m_IgnoreMobiles || TransformationSpellHelper.UnderTransformation( shoved, typeof( WraithFormSpell ) ) ) return true; else return base.CheckShove( shoved ); @@ -2762,6 +2824,9 @@ namespace Server.Mobiles if( m_ChampionTitles == null ) m_ChampionTitles = new ChampionTitleInfo(); + + if ( AccessLevel > AccessLevel.Player ) + m_IgnoreMobiles = true; List list = this.Stabled; @@ -3247,6 +3312,11 @@ namespace Server.Mobiles public override void OnAccessLevelChanged( AccessLevel oldLevel ) { + if ( AccessLevel == AccessLevel.Player ) + IgnoreMobiles = false; + else + IgnoreMobiles = true; + InvalidateMyRunUO(); } diff --git a/Scripts/Mobiles/Vendors/SBInfo/SBMage.cs b/Scripts/Mobiles/Vendors/SBInfo/SBMage.cs index 89b7b4790..a783d49c5 100644 --- a/Scripts/Mobiles/Vendors/SBInfo/SBMage.cs +++ b/Scripts/Mobiles/Vendors/SBInfo/SBMage.cs @@ -91,6 +91,16 @@ namespace Server.Mobiles Add( typeof( Nightshade ), 2 ); Add( typeof( SpidersSilk ), 2 ); Add( typeof( SulfurousAsh ), 2 ); + + if ( Core.AOS ) + { + Add( typeof( BatWing ), 1 ); + Add( typeof( DaemonBlood ), 3 ); + Add( typeof( PigIron ), 2 ); + Add( typeof( NoxCrystal ), 3 ); + Add( typeof( GraveDust ), 1 ); + } + Add( typeof( RecallRune ), 13 ); Add( typeof( Spellbook ), 25 ); diff --git a/Scripts/Multis/HouseFoundation.cs b/Scripts/Multis/HouseFoundation.cs index 38f347ba9..068cd1db5 100644 --- a/Scripts/Multis/HouseFoundation.cs +++ b/Scripts/Multis/HouseFoundation.cs @@ -890,7 +890,7 @@ namespace Server.Multis public void EndConfirmCommit( Mobile from ) { int oldPrice = Price; - int newPrice = oldPrice + CustomizationCost + ((DesignState.Components.List.Length - CurrentState.Components.List.Length) * 500); + int newPrice = oldPrice + CustomizationCost + ((DesignState.Components.List.Length - ( CurrentState.Components.List.Length + CurrentState.Fixtures.Length )) * 500); int cost = newPrice - oldPrice; if ( !this.Deleted ) { // Temporary Fix. We should be booting a client out of customization mode in the delete handler. @@ -991,7 +991,7 @@ namespace Server.Multis if( context != null ) { int oldPrice = context.Foundation.Price; - int newPrice = oldPrice + context.Foundation.CustomizationCost + ((context.Foundation.DesignState.Components.List.Length - context.Foundation.CurrentState.Components.List.Length) * 500); + int newPrice = oldPrice + context.Foundation.CustomizationCost + ((context.Foundation.DesignState.Components.List.Length - ( context.Foundation.CurrentState.Components.List.Length + context.Foundation.Fixtures.Count) ) * 500); int bankBalance = Banker.GetBalance( from ); from.SendGump( new ConfirmCommitGump( from, context.Foundation, bankBalance, oldPrice, newPrice ) ); @@ -1936,8 +1936,16 @@ namespace Server.Multis AddHtmlLocalized( 10, 235, 150, 20, 1061900, 1023, false, false ); // Cost To Commit: AddLabel( 170, 235, 90, newPrice.ToString() ); - AddHtmlLocalized( 10, 260, 150, 20, 1061901, 31744, false, false ); // Your Cost: - AddLabel( 170, 260, 40, (newPrice - oldPrice).ToString() ); + if ( newPrice - oldPrice < 0 ) + { + AddHtmlLocalized( 10, 260, 150, 20, 1062059, 992, false, false ); // Your Refund: + AddLabel( 170, 260, 70, (oldPrice - newPrice).ToString() ); + } + else + { + AddHtmlLocalized( 10, 260, 150, 20, 1061901, 31744, false, false ); // Your Cost: + AddLabel( 170, 260, 40, (newPrice - oldPrice).ToString() ); + } AddButton( 10, 290, 4005, 4007, 1, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 45, 290, 55, 20, 1011036, 32767, false, false ); // OKAY diff --git a/Scripts/Multis/HousePlacement.cs b/Scripts/Multis/HousePlacement.cs index db4c408ce..1140f965b 100644 --- a/Scripts/Multis/HousePlacement.cs +++ b/Scripts/Multis/HousePlacement.cs @@ -30,22 +30,15 @@ namespace Server.Multis // Any land tile which matches one of these ID numbers is considered a road and cannot be placed over. private static int[] m_RoadIDs = new int[] { - 0x071, 0x08C, - 0x0E8, 0x0EB, - 0x14C, 0x14F, - 0x161, 0x174, - 0x1F0, 0x1F3, - 0x26E, 0x279, - 0x27E, 0x281, - 0x324, 0x3AC, - 0x547, 0x556, - 0x597, 0x5A6, - 0x637, 0x63A, - 0x7AE, 0x7B1, - 0x442, 0x479, // Sand stones - 0x501, 0x510, // Sand stones - 0x009, 0x015, // Furrows - 0x150, 0x15C // Furrows + 0x0071, 0x0078, + 0x00E8, 0x00EB, + 0x07AE, 0x07B1, + 0x3FF4, 0x3FF4, + 0x3FF8, 0x3FFB, + 0x0442, 0x0479, // Sand stones + 0x0501, 0x0510, // Sand stones + 0x0009, 0x0015, // Furrows + 0x0150, 0x015C // Furrows }; public static HousePlacementResult Check( Mobile from, int multiID, Point3D center, out ArrayList toMove ) diff --git a/Scripts/Skills/AnimalLore.cs b/Scripts/Skills/AnimalLore.cs index e8efe4723..f915e6438 100644 --- a/Scripts/Skills/AnimalLore.cs +++ b/Scripts/Skills/AnimalLore.cs @@ -42,11 +42,11 @@ namespace Server.SkillHandlers { if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea ) { - if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Base < 100.0 ) + if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Value < 100.0 ) { from.SendLocalizedMessage( 1049674 ); // At your skill level, you can only lore tamed creatures. } - else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Base < 110.0 ) + else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Value < 110.0 ) { from.SendLocalizedMessage( 1049675 ); // At your skill level, you can only lore tamed or tameable creatures. } diff --git a/Scripts/Skills/AnimalTaming.cs b/Scripts/Skills/AnimalTaming.cs index 9ea92f71f..c08a536ea 100644 --- a/Scripts/Skills/AnimalTaming.cs +++ b/Scripts/Skills/AnimalTaming.cs @@ -5,6 +5,8 @@ using Server.Targeting; using Server.Network; using Server.Mobiles; using Server.Factions; +using Server.Spells; +using Server.Spells.Spellweaving; namespace Server.SkillHandlers { @@ -180,7 +182,7 @@ namespace Server.SkillHandlers creature.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 502805, from.NetState ); // You seem to anger the beast! creature.PlaySound( creature.GetAngerSound() ); creature.Direction = creature.GetDirectionTo( from ); - if ( from is PlayerMobile && !( (PlayerMobile)from ).HonorActive ) + if ( from is PlayerMobile && !(( (PlayerMobile)from ).HonorActive || TransformationSpellHelper.UnderTransformation( from, typeof( EtherealVoyageSpell )))) creature.Combatant = from; } else diff --git a/Scripts/Spells/Base/SpellHelper.cs b/Scripts/Spells/Base/SpellHelper.cs index 55dc9592e..4833971cc 100644 --- a/Scripts/Spells/Base/SpellHelper.cs +++ b/Scripts/Spells/Base/SpellHelper.cs @@ -974,23 +974,24 @@ namespace Server.Spells public static void DoLeech( int damageGiven, Mobile from, Mobile target ) { TransformContext context = TransformationSpellHelper.GetContext( from ); - if ( context != null && context.Type == typeof( WraithFormSpell ) ) + + if ( context != null ) /* cleanup */ { - int wraithLeech = ( 5 + (int)( ( 15 * from.Skills.SpiritSpeak.Value ) / 100 ) ); // Wraith form gives 5-20% mana leech - int manaLeech = AOS.Scale( damageGiven, wraithLeech ); - if ( manaLeech != 0 ) + if ( context.Type == typeof( WraithFormSpell ) ) { - // Mana leeched by the Wraith Form spell is actually stolen, not just leeched. - target.Mana -= manaLeech; - from.Mana += manaLeech; - from.PlaySound( 0x44D ); - //from.SendMessage(String.Format("You Leeched {0} Mana", manaLeech)); + int wraithLeech = ( 5 + (int)( ( 15 * from.Skills.SpiritSpeak.Value ) / 100 ) ); // Wraith form gives 5-20% mana leech + int manaLeech = AOS.Scale( damageGiven, wraithLeech ); + if ( manaLeech != 0 ) + { + from.Mana += manaLeech; + from.PlaySound( 0x44D ); + } + } + else if ( context.Type == typeof( VampiricEmbraceSpell ) ) + { + from.Hits += AOS.Scale( damageGiven, 20 ); + from.PlaySound( 0x44D ); } - } - if ( context != null && context.Type == typeof( VampiricEmbraceSpell ) ) - { - from.Hits += AOS.Scale( damageGiven, 20 ); - from.PlaySound( 0x44D ); } } diff --git a/Scripts/Spells/Bushido/LightningStrike.cs b/Scripts/Spells/Bushido/LightningStrike.cs index a05c23e41..8c64ed384 100644 --- a/Scripts/Spells/Bushido/LightningStrike.cs +++ b/Scripts/Spells/Bushido/LightningStrike.cs @@ -25,44 +25,57 @@ namespace Server.Spells.Bushido return 50; } + public override bool Validate(Mobile from) + { + bool isValid=base.Validate(from); + if (isValid) + { + PlayerMobile ThePlayer = from as PlayerMobile; + ThePlayer.ExecutesLightningStrike = BaseMana; + } + return isValid; + } + public override bool IgnoreArmor( Mobile attacker ) { double bushido = attacker.Skills[SkillName.Bushido].Value; - double criticalChance = (bushido * bushido) / 72000.0; - return ( criticalChance >= Utility.RandomDouble() ); } public override bool OnBeforeSwing( Mobile attacker, Mobile defender ) { - return Validate( attacker ) && CheckMana( attacker, true ); + /* no mana drain before actual hit */ + bool enoughMana = CheckMana(attacker, false); + return Validate(attacker); } public override bool ValidatesDuringHit { get { return false; } } public override void OnHit( Mobile attacker, Mobile defender, int damage ) { - //Validation in OnBeforeSwing - - ClearCurrentMove( attacker ); - - attacker.SendLocalizedMessage( 1063168 ); // You attack with lightning precision! - defender.SendLocalizedMessage( 1063169 ); // Your opponent's quick strike causes extra damage! - - defender.FixedParticles( 0x3818, 1, 11, 0x13A8, 0, 0, EffectLayer.Waist ); - defender.PlaySound( 0x51D ); - - CheckGain( attacker ); - - SetContext( attacker ); + ClearCurrentMove(attacker); + if (CheckMana(attacker, true)) + { + attacker.SendLocalizedMessage(1063168); // You attack with lightning precision! + defender.SendLocalizedMessage(1063169); // Your opponent's quick strike causes extra damage! + defender.FixedParticles(0x3818, 1, 11, 0x13A8, 0, 0, EffectLayer.Waist); + defender.PlaySound(0x51D); + CheckGain(attacker); + SetContext(attacker); + } } public override void OnMiss( Mobile attacker, Mobile defender ) { ClearCurrentMove( attacker ); - SetContext( attacker ); } + + public override void OnClearMove( Mobile attacker ) + { + PlayerMobile ThePlayer = attacker as PlayerMobile; // this can be deletet if the PlayerMobile parts are moved to Server.Mobile + ThePlayer.ExecutesLightningStrike = 0; + } } } diff --git a/Scripts/Spells/Chivalry/NobleSacrifice.cs b/Scripts/Spells/Chivalry/NobleSacrifice.cs index 0ca3dc1df..cb6332787 100644 --- a/Scripts/Spells/Chivalry/NobleSacrifice.cs +++ b/Scripts/Spells/Chivalry/NobleSacrifice.cs @@ -43,7 +43,7 @@ namespace Server.Spells.Chivalry if ( m is BaseCreature && ((BaseCreature)m).IsAnimatedDead ) continue; - if ( Caster != m && Caster.CanBeBeneficial( m, false, true ) && !(m is Golem) ) + if ( Caster != m && m.InLOS( Caster ) && Caster.CanBeBeneficial( m, false, true ) && !(m is Golem) ) targets.Add( m ); } @@ -72,9 +72,6 @@ namespace Server.Spells.Chivalry { Caster.SendLocalizedMessage( 1010395 ); // The veil of death in this area is too strong and resists thy efforts to restore life. } - else if( Core.ML && m.Region != null && m.Region.IsPartOf( typeof( HouseRegion ) ) ) - { - } else if( resChance > Utility.RandomDouble() ) { m.FixedParticles( 0x375A, 1, 15, 5005, 5, 3, EffectLayer.Head ); diff --git a/Scripts/Spells/Fifth/Paralyze.cs b/Scripts/Spells/Fifth/Paralyze.cs index aff741887..988fecfdf 100644 --- a/Scripts/Spells/Fifth/Paralyze.cs +++ b/Scripts/Spells/Fifth/Paralyze.cs @@ -2,6 +2,7 @@ using System; using Server.Mobiles; using Server.Targeting; using Server.Network; +using Server.Spells.Chivalry; namespace Server.Spells.Fifth { @@ -33,7 +34,7 @@ namespace Server.Spells.Fifth { Caster.SendLocalizedMessage( 500237 ); // Target can not be seen. } - else if ( Core.AOS && (m.Frozen || m.Paralyzed || (m.Spell != null && m.Spell.IsCasting)) ) + else if ( Core.AOS && (m.Frozen || m.Paralyzed || (m.Spell != null && m.Spell.IsCasting && !(m.Spell is PaladinSpell))) ) { Caster.SendLocalizedMessage( 1061923 ); // The target is already frozen. } diff --git a/Scripts/Spells/Necromancy/WraithForm.cs b/Scripts/Spells/Necromancy/WraithForm.cs index a5ed2deb4..2d78c09e7 100644 --- a/Scripts/Spells/Necromancy/WraithForm.cs +++ b/Scripts/Spells/Necromancy/WraithForm.cs @@ -3,6 +3,7 @@ using System.Collections; using Server.Network; using Server.Items; using Server.Targeting; +using Server.Mobiles; namespace Server.Spells.Necromancy { @@ -36,8 +37,17 @@ namespace Server.Spells.Necromancy public override void DoEffect( Mobile m ) { + if ( m is PlayerMobile ) + ((PlayerMobile)m).IgnoreMobiles = true; + m.PlaySound( 0x17F ); m.FixedParticles( 0x374A, 1, 15, 9902, 1108, 4, EffectLayer.Waist ); } + + public override void RemoveEffect( Mobile m ) + { + if ( m is PlayerMobile && m.AccessLevel == AccessLevel.Player ) + ((PlayerMobile)m).IgnoreMobiles = false; + } } } \ No newline at end of file