Unit* AscentScriptCreatureAI::GetBestUnitTarget( TargetFilter pTargetFilter, float pMinRange, float pMaxRange ) { //Build potential target list UnitArray TargetArray; if ( pTargetFilter & TargetFilter_Friendly ) { for ( unordered_set< Object* >::iterator ObjectIter = _unit->GetInRangeSetBegin(); ObjectIter != _unit->GetInRangeSetEnd(); ++ObjectIter ) { if ( IsValidUnitTarget( *ObjectIter, pTargetFilter, pMinRange, pMaxRange ) ) TargetArray.push_back( TO_UNIT( *ObjectIter ) ); }; if ( IsValidUnitTarget( _unit, pTargetFilter ) ) TargetArray.push_back( _unit ); //Also add self as possible friendly target } else { for ( unordered_set< Object* >::iterator ObjectIter = _unit->GetInRangeOppFactsSetBegin(); ObjectIter != _unit->GetInRangeOppFactsSetEnd(); ++ObjectIter ) { if ( IsValidUnitTarget( *ObjectIter, pTargetFilter, pMinRange, pMaxRange ) ) TargetArray.push_back( TO_UNIT( *ObjectIter ) ); }; }; return ChooseBestTargetInArray( TargetArray, pTargetFilter ); };
Unit *MoonScriptCreatureAI::GetBestUnitTarget( TargetFilters pTargetFilter, float pMinRange, float pMaxRange) { //Build potential target list UnitArray TargetArray; if ( pTargetFilter & TargetFilter_Friendly ) { for ( unordered_set< Object *>::iterator ObjectIter = _unit->GetInRangeSetBegin(); ObjectIter != _unit->GetInRangeSetEnd(); ++ObjectIter ) { // Trololololo....... if( IsValidUnitTarget(*ObjectIter, pTargetFilter, pMinRange, pMaxRange) ) { if(pTargetFilter & TargetFilter_ManaClass) { if(TO_UNIT(*ObjectIter)->GetPowerType() == POWER_TYPE_MANA) TargetArray.push_back( TO_UNIT( *ObjectIter ) ); } else TargetArray.push_back( TO_UNIT( *ObjectIter ) ); } }; if ( IsValidUnitTarget( _unit, pTargetFilter ) ) TargetArray.push_back( _unit ); //Also add self as possible friendly target } else { for ( unordered_set< Object *>::iterator ObjectIter = _unit->GetInRangeOppFactsSetBegin(); ObjectIter != _unit->GetInRangeOppFactsSetEnd(); ++ObjectIter ) { // Problem, Dylan? if( IsValidUnitTarget(*ObjectIter, pTargetFilter, pMinRange, pMaxRange) ) { if(pTargetFilter & TargetFilter_ManaClass) { if(TO_UNIT(*ObjectIter)->GetPowerType() == POWER_TYPE_MANA) TargetArray.push_back( TO_UNIT( *ObjectIter ) ); } else TargetArray.push_back( TO_UNIT( *ObjectIter ) ); } }; }; return ChooseBestTargetInArray( TargetArray, pTargetFilter ); };
Unit *AIInterface::GetBestUnitTarget( uint32 pTargetFilter, float pMinRange, float pMaxRange) { //Build potential target list set<Unit*> TargetSet; if ( pTargetFilter & TargetFilter_Friendly ) { for ( Object::InRangeSet::iterator ObjectIter = m_Unit->GetInRangeSetBegin(); ObjectIter != m_Unit->GetInRangeSetEnd(); ++ObjectIter ) { if( IsValidUnitTarget(*ObjectIter, pTargetFilter, pMinRange, pMaxRange) ) { if(pTargetFilter & TargetFilter_ManaClass) { if(TO_UNIT(*ObjectIter)->GetPowerType() == POWER_TYPE_MANA) TargetSet.insert( TO_UNIT( *ObjectIter ) ); } else TargetSet.insert( TO_UNIT( *ObjectIter ) ); } } if ( IsValidUnitTarget( m_Unit, pTargetFilter ) ) TargetSet.insert( m_Unit ); //Also add self as possible friendly target } else { for ( Object::InRangeSet::iterator ObjectIter = m_Unit->GetInRangeOppFactsSetBegin(); ObjectIter != m_Unit->GetInRangeOppFactsSetEnd(); ++ObjectIter ) { if( IsValidUnitTarget(*ObjectIter, pTargetFilter, pMinRange, pMaxRange) ) { if(pTargetFilter & TargetFilter_ManaClass) { if(TO_UNIT(*ObjectIter)->GetPowerType() == POWER_TYPE_MANA) TargetSet.insert( TO_UNIT( *ObjectIter ) ); } else TargetSet.insert( TO_UNIT( *ObjectIter ) ); } } } return ChooseBestTargetInSet( TargetSet, pTargetFilter ); }
Unit* ArcScriptCreatureAI::GetBestPlayerTarget(TargetFilter pFilter) { //Build potential target list UnitArray TargetArray; for( set<Player*>::iterator PlayerIter = _unit->GetInRangePlayerSetBegin(); PlayerIter != _unit->GetInRangePlayerSetEnd(); ++PlayerIter ) { if( IsValidUnitTarget(*PlayerIter, pFilter) ) TargetArray.push_back(static_cast<Unit*>(*PlayerIter)); } return ChooseBestTargetInArray(TargetArray, pFilter); }
Unit *MoonScriptCreatureAI::GetBestPlayerTarget( TargetFilters pTargetFilter, float pMinRange, float pMaxRange) { //Build potential target list UnitArray TargetArray; for ( unordered_set< Player *>::iterator PlayerIter = _unit->GetInRangePlayerSetBegin(); PlayerIter != _unit->GetInRangePlayerSetEnd(); ++PlayerIter ) { if ( IsValidUnitTarget( *PlayerIter, pTargetFilter, pMinRange, pMaxRange ) ) TargetArray.push_back( TO_UNIT( *PlayerIter ) ); }; return ChooseBestTargetInArray( TargetArray, pTargetFilter ); };
Unit *AIInterface::GetBestPlayerTarget( uint32 pTargetFilter, float pMinRange, float pMaxRange) { //Build potential target list set<Unit*> TargetSet; for ( PlayerSet::iterator PlayerIter = m_Unit->GetInRangePlayerSetBegin(); PlayerIter != m_Unit->GetInRangePlayerSetEnd(); PlayerIter++ ) { if ( IsValidUnitTarget( *PlayerIter, pTargetFilter, pMinRange, pMaxRange ) ) TargetSet.insert( TO_UNIT( *PlayerIter ) ); } return ChooseBestTargetInSet( TargetSet, pTargetFilter ); }
Unit* ArcScriptCreatureAI::GetBestUnitTarget(TargetFilter pFilter) { //Build potential target list UnitArray TargetArray; if( pFilter & TargetFilter_Friendly ) { for( std::set<Object*>::iterator ObjectIter = _unit->GetInRangeSetBegin(); ObjectIter != _unit->GetInRangeSetEnd(); ++ObjectIter ) { if( IsValidUnitTarget(*ObjectIter, pFilter) ) TargetArray.push_back(static_cast<Unit*>(*ObjectIter)); } if( IsValidUnitTarget(_unit, pFilter) ) TargetArray.push_back(_unit); //Also add self as possible friendly target } else { for( std::set<Object*>::iterator ObjectIter = _unit->GetInRangeOppFactsSetBegin(); ObjectIter != _unit->GetInRangeOppFactsSetEnd(); ++ObjectIter ) { if( IsValidUnitTarget(*ObjectIter, pFilter) ) TargetArray.push_back(static_cast<Unit*>(*ObjectIter)); } } return ChooseBestTargetInArray(TargetArray, pFilter); }
UnitArray GetInRangePlayers() { UnitArray TargetArray; for (unordered_set<Player*>::iterator itr = _unit->GetInRangePlayerSetBegin(); itr != _unit->GetInRangePlayerSetEnd(); itr++) { if (IsValidUnitTarget(*itr, TargetFilter_None)) { TargetArray.push_back(TO_UNIT(*itr)); } } return TargetArray; }
UnitArray GetInRangePlayers() { UnitArray TargetArray; for (set< Object* >::iterator itr = _unit->GetInRangePlayerSetBegin(); itr != _unit->GetInRangePlayerSetEnd(); ++itr) { if (IsValidUnitTarget(*itr, TargetFilter_None)) { TargetArray.push_back(TO< Unit* >(*itr)); } } return TargetArray; }
Unit *AIInterface::GetTargetForSpell( AI_Spell* pSpell ) { if(pSpell == NULL) return NULLUNIT; //Check if run-to-target cache and return it if its valid if ( m_nextTarget && IsValidUnitTarget( m_nextTarget, pSpell->TargetFilter, pSpell->mindist2cast, pSpell->maxdist2cast ) ) return m_nextTarget; // Find a suitable target for the described situation :) switch( pSpell->TargetType ) { case TargetGen_Self: { if ( !m_Unit->isAlive() ) return NULLUNIT; if ( ( pSpell->TargetFilter & TargetFilter_Wounded ) && m_Unit->GetHealthPct() >= 99 ) return NULLUNIT; if(pSpell->mPredefinedTarget != NULL) return pSpell->mPredefinedTarget; return m_Unit; }break; case TargetGen_SecondMostHated: { Unit* m_Result = GetSecondHated(pSpell); if(m_Result == NULLUNIT) m_Result = GetMostHated(pSpell); return m_Result; }break; case TargetGen_Current: case TargetGen_Destination: return m_nextTarget; case TargetGen_Predefined: return pSpell->mPredefinedTarget; case TargetGen_RandomPlayer: case TargetGen_RandomPlayerApplyAura: case TargetGen_RandomPlayerDestination: return GetBestPlayerTarget( pSpell->TargetFilter, pSpell->mindist2cast, pSpell->maxdist2cast ); case TargetGen_RandomUnit: case TargetGen_RandomUnitApplyAura: case TargetGen_RandomUnitDestination: case TargetGen_ManaClass: return GetBestUnitTarget( pSpell->TargetFilter, pSpell->mindist2cast, pSpell->maxdist2cast ); default: sLog.outDebug("MoonScriptCreatureAI::GetTargetForSpell() : Invalid target type!\n"); return NULLUNIT; } }
Unit *MoonScriptCreatureAI::GetTargetForSpell( SpellDesc* pSpell ) { //Check if run-to-target cache and return it if its valid if ( mRunToTargetCache && mRunToTargetSpellCache == pSpell && IsValidUnitTarget( mRunToTargetCache, TargetFilter_None ) ) return mRunToTargetCache; //Find a suitable target for the described situation :) switch( pSpell->mTargetType.mTargetGenerator ) { case TargetGen_Self: if ( !IsAlive() ) return NULLUNIT; if ( ( pSpell->mTargetType.mTargetFilter & TargetFilter_Wounded ) && _unit->GetHealthPct() >= 99 ) return NULLUNIT; return _unit; case TargetGen_SecondMostHated: return _unit->GetAIInterface()->GetSecondHated(); case TargetGen_Current: case TargetGen_Destination: return _unit->GetAIInterface()->GetNextTarget(); case TargetGen_Predefined: return pSpell->mPredefinedTarget; case TargetGen_RandomPlayer: case TargetGen_RandomPlayerApplyAura: case TargetGen_RandomPlayerDestination: return GetBestPlayerTarget( pSpell->mTargetType.mTargetFilter, pSpell->mMinRange, pSpell->mMaxRange ); case TargetGen_RandomUnit: case TargetGen_RandomUnitApplyAura: case TargetGen_RandomUnitDestination: case TargetGen_ManaClass: return GetBestUnitTarget( pSpell->mTargetType.mTargetFilter, pSpell->mMinRange, pSpell->mMaxRange ); default: sLog.outDebug("MoonScriptCreatureAI::GetTargetForSpell() : Invalid target type!\n"); return NULLUNIT; }; };
Unit* ArcScriptCreatureAI::GetTargetForSpell(SpellDesc* pSpell) { //Check if run-to-target cache and return it if its valid if( mRunToTargetCache && mRunToTargetSpellCache == pSpell && IsValidUnitTarget(mRunToTargetCache, TargetFilter_None) ) { return mRunToTargetCache; } //Find a suitable target for the described situation :) switch( pSpell->mTargetType ) { case Target_Self: return _unit; case Target_SecondMostHated: return GetBestPlayerTarget(TargetFilter_SecondMostHated); case Target_Current: case Target_Destination: return _unit->GetAIInterface()->GetNextTarget(); case Target_Predefined: return pSpell->mPredefinedTarget; case Target_RandomPlayer: case Target_RandomDestination: case Target_RandomPlayerApplyAura: return GetBestPlayerTarget(); case Target_RandomPlayerNotCurrent: return GetBestPlayerTarget(TargetFilter_NotCurrent); case Target_RandomUnit: return GetBestUnitTarget(); case Target_RandomUnitNotCurrent: return GetBestUnitTarget(TargetFilter_NotCurrent); case Target_RandomFriendly: return GetBestUnitTarget(TargetFilter_Friendly); case Target_WoundedPlayer: return GetBestPlayerTarget(TargetFilter_Wounded); case Target_WoundedUnit: return GetBestUnitTarget(TargetFilter_Wounded); case Target_WoundedFriendly: return GetBestUnitTarget(TargetFilter(TargetFilter_Wounded | TargetFilter_Friendly)); case Target_ClosestPlayer: return GetBestPlayerTarget(TargetFilter_Closest); case Target_ClosestPlayerNotCurrent: return GetBestPlayerTarget(TargetFilter(TargetFilter_Closest | TargetFilter_NotCurrent)); case Target_ClosestUnit: return GetBestUnitTarget(TargetFilter_Closest); case Target_ClosestUnitNotCurrent: return GetBestUnitTarget(TargetFilter(TargetFilter_Closest | TargetFilter_NotCurrent)); case Target_ClosestFriendly: return GetBestUnitTarget(TargetFilter(TargetFilter_Closest | TargetFilter_Friendly)); default: sLog.outDebug("ArcScriptCreatureAI::GetTargetForSpell() : Invalid target type!\n"); return NULL; } }