From 37d52194bd33fa1f1443f588fc6e18e87b2e0604 Mon Sep 17 00:00:00 2001 From: xavier Date: Sat, 10 Nov 2012 16:47:47 +0000 Subject: [PATCH] changes to support Flying, Dragon AI re-targeting, tamed pets have 10% chance to stop following master when hit by other mobiles.. --- Scripts/Mobiles/BaseCreature.cs | 69 ++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/Scripts/Mobiles/BaseCreature.cs b/Scripts/Mobiles/BaseCreature.cs index 9ea9a3893..4d9ee4d14 100644 --- a/Scripts/Mobiles/BaseCreature.cs +++ b/Scripts/Mobiles/BaseCreature.cs @@ -663,6 +663,8 @@ namespace Server.Mobiles #endregion + public virtual bool CanFly { get { return false; } } + #region Spill Acid public void SpillAcid( int Amount ) @@ -1292,6 +1294,17 @@ namespace Server.Mobiles public HonorContext ReceivedHonorContext{ get{ return m_ReceivedHonorContext; } set{ m_ReceivedHonorContext = value; } } + public virtual void CheckStopFollow( Mobile from ) + { + if( ControlOrder == OrderType.Follow && Utility.RandomDouble() < .10 ) + { + ControlTarget = from; + ControlOrder = OrderType.Attack; + Combatant = from; + Warmode = true; + } + } + public override void OnDamage( int amount, Mobile from, bool willKill ) { if ( BardPacified && (HitsMax - Hits) * 0.001 > Utility.RandomDouble() ) @@ -1327,14 +1340,21 @@ namespace Server.Mobiles if ( m_ReceivedHonorContext != null ) m_ReceivedHonorContext.OnTargetDamaged( from, amount ); - if ( willKill && from is PlayerMobile ) - Timer.DelayCall( TimeSpan.FromSeconds( 10 ), new TimerCallback( ((PlayerMobile) from).RecoverAmmo ) ); + if( !willKill ) + { + CheckStopFollow( from ); + } + else if( from is PlayerMobile ) + { + Timer.DelayCall( TimeSpan.FromSeconds( 10 ), new TimerCallback( ( ( PlayerMobile )from ).RecoverAmmo ) ); + } base.OnDamage( amount, from, willKill ); } public virtual void OnDamagedBySpell( Mobile from ) { + CheckStopFollow( from ); } public virtual void OnHarmfulSpell( Mobile from ) @@ -3391,6 +3411,18 @@ namespace Server.Mobiles m_AI.Activate(); } + public override void OnCombatantChange() + { + base.OnCombatantChange(); + + Warmode = ( Combatant != null && !Combatant.Deleted && Combatant.Alive ); + + if( CanFly && Warmode ) + { + Flying = false; + } + } + protected override void OnMapChange( Map oldMap ) { CheckAIActive(); @@ -3405,12 +3437,32 @@ namespace Server.Mobiles base.OnLocationChange( oldLocation ); } + public virtual void ForceReacquire() + { + m_NextReacquireTime = DateTime.MinValue; + } + public override void OnMovement( Mobile m, Point3D oldLocation ) { - base.OnMovement( m, oldLocation ); + if( AcquireOnApproach ) + { + if( InRange( m.Location, AcquireOnApproachRange ) && !InRange( oldLocation, AcquireOnApproachRange ) ) + { + if( CanBeHarmful( m ) ) + { + Combatant = FocusMob = m; - if ( ReacquireOnMovement || m_Paragon ) - ForceReacquire(); + if( AIObject != null ) + { + AIObject.MoveTo( m, true, 1 ); + } + } + } + } + else if( ReacquireOnMovement ) + { + m_NextReacquireTime = DateTime.MinValue; + } InhumanSpeech speechType = this.SpeechType; @@ -4727,11 +4779,8 @@ namespace Server.Mobiles public virtual TimeSpan ReacquireDelay{ get{ return TimeSpan.FromSeconds( 10.0 ); } } public virtual bool ReacquireOnMovement{ get{ return false; } } - - public void ForceReacquire() - { - m_NextReacquireTime = DateTime.MinValue; - } + public virtual bool AcquireOnApproach{ get { return m_Paragon; } } + public virtual int AcquireOnApproachRange { get { return 10; } } public override void OnDelete() {