public InternalTarget( RemoveCurseSpell owner ) : base( Core.ML ? 10 : 12, false, TargetFlags.Beneficial ) { m_Owner = owner; }
public InternalTarget(RemoveCurseSpell owner) : base(Core.ML ? 10 : 12, false, TargetFlags.Beneficial) { this.m_Owner = owner; }
public virtual Spell DoCombo( Mobile c ) { Spell spell = null; if ( m_Combo == 0 ) { spell = new RemoveCurseSpell( m_Mobile, null ); ++m_Combo; // Move to next spell } else if ( m_Combo == 1 ) { spell = new DivineFurySpell( m_Mobile, null ); ++m_Combo; // Move to next spell } else if ( m_Combo == 2 ) { spell = new ConsecrateWeaponSpell( m_Mobile, null ); ++m_Combo; // Move to next spell } if ( m_Combo == 3 && spell == null ) { switch ( Utility.Random( 3 ) ) { default: case 0: { if ( c.Int < c.Dex ) spell = new DivineFurySpell( m_Mobile, null ); else spell = new EnemyOfOneSpell( m_Mobile, null ); ++m_Combo; // Move to next spell break; } case 1: { spell = new HolyLightSpell( m_Mobile, null ); m_Combo = -1; // Reset combo state break; } case 2: { spell = new DispelEvilSpell( m_Mobile, null ); m_Combo = -1; // Reset combo state break; } } } else if ( m_Combo == 4 && spell == null ) { spell = new EnemyOfOneSpell( m_Mobile, null ); m_Combo = -1; } return spell; }
public InternalTarget(RemoveCurseSpell owner) : base(10, false, TargetFlags.Beneficial) { m_Owner = owner; }
public override bool DoActionCombat() { Mobile c = m_Mobile.Combatant; m_Mobile.Warmode = true; if ( c == null || c.Deleted || !c.Alive || c.IsDeadBondedPet || !m_Mobile.CanSee( c ) || !m_Mobile.CanBeHarmful( c, false ) || c.Map != m_Mobile.Map ) { // Our combatant is deleted, dead, hidden, or we cannot hurt them // Try to find another combatant if ( AcquireFocusMob( m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true ) ) { if ( m_Mobile.Debug ) m_Mobile.DebugSay( "Something happened to my combatant, so I am going to fight {0}", m_Mobile.FocusMob.Name ); m_Mobile.Combatant = c = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } else { m_Mobile.DebugSay( "Something happened to my combatant, and nothing is around. I am on guard." ); Action = ActionType.Guard; return true; } } if ( !m_Mobile.InLOS( c ) ) { if ( AcquireFocusMob( m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true ) ) { m_Mobile.Combatant = c = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } } if ( SmartAI && !m_Mobile.StunReady && m_Mobile.Skills[SkillName.Swords].Value >= 80.0 && m_Mobile.Skills[SkillName.Anatomy].Value >= 80.0 ) EventSink.InvokeStunRequest( new StunRequestEventArgs( m_Mobile ) ); if ( !m_Mobile.InRange( c, m_Mobile.RangePerception ) ) { // They are somewhat far away, can we find something else? if ( AcquireFocusMob( m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true ) ) { m_Mobile.Combatant = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } else if ( !m_Mobile.InRange( c, m_Mobile.RangePerception * 3 ) ) { m_Mobile.Combatant = null; } c = m_Mobile.Combatant; if ( c == null ) { m_Mobile.DebugSay( "My combatant has fled, so I am on guard" ); Action = ActionType.Guard; return true; } } if ( !m_Mobile.Controlled && !m_Mobile.Summoned ) { if ( m_Mobile.Hits < m_Mobile.HitsMax * 20/100 ) { // We are low on health, should we flee? bool flee = false; if ( m_Mobile.Hits < c.Hits ) { // We are more hurt than them int diff = c.Hits - m_Mobile.Hits; flee = ( Utility.Random( 0, 100 ) > (10 + diff) ); // (10 + diff)% chance to flee } else { flee = Utility.Random( 0, 100 ) > 10; // 10% chance to flee } if ( flee ) { if ( m_Mobile.Debug ) m_Mobile.DebugSay( "I am going to flee from {0}", c.Name ); Action = ActionType.Flee; return true; } } } if ( m_Mobile.Spell == null && DateTime.Now > m_NextCastTime && m_Mobile.InRange( c, 12 ) ) { // We are ready to cast a spell Spell spell = null; Mobile toDispel = FindDispelTarget( true ); if ( m_Mobile.Poisoned ) // Top cast priority is cure { spell = new CleanseByFireSpell( m_Mobile, null ); } else if ( toDispel != null ) // Paladins cant dispel... but its useful.. I know.. Im cheating players this way... { spell = DoDispel( toDispel ); } else if ( SmartAI && m_Combo != -1 ) // We are doing a spell combo { spell = DoCombo( c ); } else if ( SmartAI && (c.Spell is HealSpell || c.Spell is GreaterHealSpell) && !c.Poisoned ) // They are going to heal with a spell... disrupt it the only way we can... { spell = new DivineFurySpell( m_Mobile, null ); // ... by going nuts on them. } else if ( SmartAI && ( c.Spell is BloodOathSpell || c.Spell is EvilOmenSpell || c.Spell is StrangleSpell || c.Spell is CurseSpell || c.Spell is WeakenSpell || c.Spell is ClumsySpell ) ) //Are we cursed by a necro or a mage? { spell = new RemoveCurseSpell( m_Mobile, null ); // Lets get rid of the curse then. } else { spell = ChooseSpell( c ); } // Now we have a spell picked // Move first before casting if ( SmartAI && toDispel != null ) { if ( m_Mobile.InRange( toDispel, 10 ) ) RunFrom( toDispel ); else if ( !m_Mobile.InRange( toDispel, 12 ) ) RunTo( toDispel ); } else { RunTo( c ); } if ( spell != null && spell.Cast() ) { TimeSpan delay; if ( SmartAI || ( spell is DispelSpell ) ) { delay = TimeSpan.FromSeconds( m_Mobile.ActiveSpeed ); } else { double del = ScaleByChivalry( 3.0 ); double min = 6.0 - (del * 0.75); double max = 6.0 - (del * 1.25); delay = TimeSpan.FromSeconds( min + ((max - min) * Utility.RandomDouble()) ); } m_NextCastTime = DateTime.Now + delay; } } else if ( m_Mobile.Spell == null || !m_Mobile.Spell.IsCasting ) { RunTo( c ); } return true; }