*Rename some script functions (no real change).
--HG-- branch : trunk
This commit is contained in:
@@ -259,147 +259,7 @@ Unit* ScriptedAI::SelectUnit(SelectAggroTarget target, uint32 position)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
|
SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTargetType Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effects)
|
||||||
{
|
|
||||||
const Unit* me;
|
|
||||||
TargetDistanceOrder(const Unit* Target) : me(Target) {};
|
|
||||||
// functor for operator ">"
|
|
||||||
bool operator()(const Unit* _Left, const Unit* _Right) const
|
|
||||||
{
|
|
||||||
return (me->GetDistance(_Left) < me->GetDistance(_Right));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Unit* ScriptedAI::SelectUnit(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly)
|
|
||||||
{
|
|
||||||
if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
|
|
||||||
{
|
|
||||||
std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
|
|
||||||
if(m_threatlist.empty()) return NULL;
|
|
||||||
std::list<Unit*> targetList;
|
|
||||||
std::list<HostilReference*>::iterator itr = m_threatlist.begin();
|
|
||||||
for(; itr!= m_threatlist.end(); ++itr)
|
|
||||||
{
|
|
||||||
Unit *target = (*itr)->getTarget();
|
|
||||||
if(!target
|
|
||||||
|| playerOnly && target->GetTypeId() != TYPEID_PLAYER
|
|
||||||
|| dist && !m_creature->IsWithinCombatRange(target, dist))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
targetList.push_back(target);
|
|
||||||
}
|
|
||||||
if(position >= targetList.size())
|
|
||||||
return NULL;
|
|
||||||
targetList.sort(TargetDistanceOrder(m_creature));
|
|
||||||
if(targetType == SELECT_TARGET_NEAREST)
|
|
||||||
{
|
|
||||||
std::list<Unit*>::iterator i = targetList.begin();
|
|
||||||
advance(i, position);
|
|
||||||
return *i;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::list<Unit*>::reverse_iterator i = targetList.rbegin();
|
|
||||||
advance(i, position);
|
|
||||||
return *i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
|
|
||||||
std::list<HostilReference*>::iterator i;
|
|
||||||
Unit *target;
|
|
||||||
while(position < m_threatlist.size())
|
|
||||||
{
|
|
||||||
if(targetType == SELECT_TARGET_BOTTOMAGGRO)
|
|
||||||
{
|
|
||||||
i = m_threatlist.end();
|
|
||||||
advance(i, - (int32)position - 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = m_threatlist.begin();
|
|
||||||
if(targetType == SELECT_TARGET_TOPAGGRO)
|
|
||||||
advance(i, position);
|
|
||||||
else // random
|
|
||||||
advance(i, position + rand()%(m_threatlist.size() - position));
|
|
||||||
}
|
|
||||||
|
|
||||||
target = (*i)->getTarget();
|
|
||||||
if(!target
|
|
||||||
|| playerOnly && target->GetTypeId() != TYPEID_PLAYER
|
|
||||||
|| dist && !m_creature->IsWithinCombatRange(target, dist))
|
|
||||||
{
|
|
||||||
m_threatlist.erase(i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScriptedAI::SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly)
|
|
||||||
{
|
|
||||||
if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
|
|
||||||
{
|
|
||||||
std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
|
|
||||||
if(m_threatlist.empty()) return;
|
|
||||||
std::list<HostilReference*>::iterator itr = m_threatlist.begin();
|
|
||||||
for(; itr!= m_threatlist.end(); ++itr)
|
|
||||||
{
|
|
||||||
Unit *target = (*itr)->getTarget();
|
|
||||||
if(!target
|
|
||||||
|| playerOnly && target->GetTypeId() != TYPEID_PLAYER
|
|
||||||
|| dist && !m_creature->IsWithinCombatRange(target, dist))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
targetList.push_back(target);
|
|
||||||
}
|
|
||||||
targetList.sort(TargetDistanceOrder(m_creature));
|
|
||||||
targetList.resize(num);
|
|
||||||
if(targetType == SELECT_TARGET_FARTHEST)
|
|
||||||
targetList.reverse();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
|
|
||||||
std::list<HostilReference*>::iterator i;
|
|
||||||
Unit *target;
|
|
||||||
while(m_threatlist.size() && num)
|
|
||||||
{
|
|
||||||
if(targetType == SELECT_TARGET_BOTTOMAGGRO)
|
|
||||||
{
|
|
||||||
i = m_threatlist.end();
|
|
||||||
--i;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = m_threatlist.begin();
|
|
||||||
if(targetType == SELECT_TARGET_RANDOM)
|
|
||||||
advance(i, rand()%m_threatlist.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
target = (*i)->getTarget();
|
|
||||||
m_threatlist.erase(i);
|
|
||||||
if(!target
|
|
||||||
|| playerOnly && target->GetTypeId() != TYPEID_PLAYER
|
|
||||||
|| dist && !m_creature->IsWithinCombatRange(target, dist))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
targetList.push_back(target);
|
|
||||||
--num;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTarget Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effects)
|
|
||||||
{
|
{
|
||||||
//No target so we can't cast
|
//No target so we can't cast
|
||||||
if (!Target)
|
if (!Target)
|
||||||
@@ -531,7 +391,7 @@ void FillSpellSummary()
|
|||||||
|
|
||||||
SpellEntry const* TempSpell;
|
SpellEntry const* TempSpell;
|
||||||
|
|
||||||
for (int i=0; i < GetSpellStore()->GetNumRows(); i++ )
|
for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
|
||||||
{
|
{
|
||||||
SpellSummary[i].Effects = 0;
|
SpellSummary[i].Effects = 0;
|
||||||
SpellSummary[i].Targets = 0;
|
SpellSummary[i].Targets = 0;
|
||||||
@@ -541,7 +401,7 @@ void FillSpellSummary()
|
|||||||
if (!TempSpell)
|
if (!TempSpell)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (int j=0; j<3; j++)
|
for(uint32 j = 0; j < 3; ++j)
|
||||||
{
|
{
|
||||||
//Spell targets self
|
//Spell targets self
|
||||||
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_UNIT_CASTER )
|
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_UNIT_CASTER )
|
||||||
@@ -802,10 +662,6 @@ void LoadOverridenDBCData()
|
|||||||
if(spellInfo = SPELL(41913))
|
if(spellInfo = SPELL(41913))
|
||||||
spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
|
spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
|
||||||
|
|
||||||
// Naxxramas : Sapphiron : Frost Breath Visual Effect
|
|
||||||
//if(spellInfo = SPELL(30101))
|
|
||||||
// spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DEST; // orig 18
|
|
||||||
|
|
||||||
//temp, not needed in 310
|
//temp, not needed in 310
|
||||||
if(spellInfo = SPELL(28531))
|
if(spellInfo = SPELL(28531))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -227,13 +227,11 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
|
|||||||
|
|
||||||
//Selects a unit from the creature's current aggro list
|
//Selects a unit from the creature's current aggro list
|
||||||
Unit* SelectUnit(SelectAggroTarget target, uint32 position);
|
Unit* SelectUnit(SelectAggroTarget target, uint32 position);
|
||||||
Unit* SelectUnit(SelectAggroTarget target, uint32 position, float dist, bool playerOnly);
|
|
||||||
void SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget target, float dist, bool playerOnly);
|
|
||||||
|
|
||||||
bool HealthBelowPct(uint32 pct) const { return me->GetHealth() * 100 < m_creature->GetMaxHealth() * pct; }
|
bool HealthBelowPct(uint32 pct) const { return me->GetHealth() * 100 < m_creature->GetMaxHealth() * pct; }
|
||||||
|
|
||||||
//Returns spells that meet the specified criteria from the creatures spell list
|
//Returns spells that meet the specified criteria from the creatures spell list
|
||||||
SpellEntry const* SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTarget Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effect);
|
SpellEntry const* SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTargetType Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effect);
|
||||||
|
|
||||||
//Checks if you can cast the specified spell
|
//Checks if you can cast the specified spell
|
||||||
bool CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered = false);
|
bool CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered = false);
|
||||||
|
|||||||
+1
-1
@@ -262,7 +262,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
|
|||||||
|
|
||||||
if (HeroicMode && banish_Timer < diff)
|
if (HeroicMode && banish_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0,30,false);
|
Unit *target = SelectTarget(SELECT_TARGET_RANDOM,0,30,false);
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
DoCast(target,SPELL_BANISH);
|
DoCast(target,SPELL_BANISH);
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
|
|||||||
// Murmur's Touch
|
// Murmur's Touch
|
||||||
if (MurmursTouch_Timer < diff)
|
if (MurmursTouch_Timer < diff)
|
||||||
{
|
{
|
||||||
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,80,true))
|
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,80,true))
|
||||||
DoCast(target, SPELL_MURMURS_TOUCH);
|
DoCast(target, SPELL_MURMURS_TOUCH);
|
||||||
MurmursTouch_Timer = 25000 + rand()%10000;
|
MurmursTouch_Timer = 25000 + rand()%10000;
|
||||||
}else MurmursTouch_Timer -= diff;
|
}else MurmursTouch_Timer -= diff;
|
||||||
@@ -162,7 +162,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
|
|||||||
// Sonic Shock
|
// Sonic Shock
|
||||||
if(SonicShock_Timer < diff)
|
if(SonicShock_Timer < diff)
|
||||||
{
|
{
|
||||||
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,20,false))
|
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,20,false))
|
||||||
if(target->isAlive())
|
if(target->isAlive())
|
||||||
DoCast(target, SPELL_SONIC_SHOCK);
|
DoCast(target, SPELL_SONIC_SHOCK);
|
||||||
SonicShock_Timer = 10000+rand()%10000;
|
SonicShock_Timer = 10000+rand()%10000;
|
||||||
|
|||||||
@@ -785,7 +785,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
|
|||||||
|
|
||||||
case EVENT_PARASITIC_SHADOWFIEND:
|
case EVENT_PARASITIC_SHADOWFIEND:
|
||||||
{
|
{
|
||||||
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 200, true))
|
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true))
|
||||||
m_creature->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true);
|
m_creature->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true);
|
||||||
Timer[EVENT_PARASITIC_SHADOWFIEND] = 35000 + rand()%10000;
|
Timer[EVENT_PARASITIC_SHADOWFIEND] = 35000 + rand()%10000;
|
||||||
}break;
|
}break;
|
||||||
@@ -907,7 +907,7 @@ struct TRINITY_DLL_DECL flame_of_azzinothAI : public ScriptedAI
|
|||||||
|
|
||||||
void ChargeCheck()
|
void ChargeCheck()
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0, 200, false);
|
Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 200, false);
|
||||||
if(target && (!m_creature->IsWithinCombatRange(target, FLAME_CHARGE_DISTANCE)))
|
if(target && (!m_creature->IsWithinCombatRange(target, FLAME_CHARGE_DISTANCE)))
|
||||||
{
|
{
|
||||||
m_creature->AddThreat(target, 5000000.0f);
|
m_creature->AddThreat(target, 5000000.0f);
|
||||||
@@ -1765,7 +1765,7 @@ struct TRINITY_DLL_DECL mob_parasitic_shadowfiendAI : public ScriptedAI
|
|||||||
{
|
{
|
||||||
if(!m_creature->getVictim())
|
if(!m_creature->getVictim())
|
||||||
{
|
{
|
||||||
if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true))
|
if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true))
|
||||||
AttackStart(target);
|
AttackStart(target);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1862,15 +1862,15 @@ void boss_illidan_stormrageAI::JustSummoned(Creature* summon)
|
|||||||
summon->setDeathState(JUST_DIED);
|
summon->setDeathState(JUST_DIED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Unit *target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0, 999, true);
|
Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 999, true);
|
||||||
if(!target || target->HasAura(SPELL_PARASITIC_SHADOWFIEND)
|
if(!target || target->HasAura(SPELL_PARASITIC_SHADOWFIEND)
|
||||||
|| target->HasAura(SPELL_PARASITIC_SHADOWFIEND2))
|
|| target->HasAura(SPELL_PARASITIC_SHADOWFIEND2))
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
|
||||||
if(target)
|
if(target)
|
||||||
summon->AI()->AttackStart(target);
|
summon->AI()->AttackStart(target);
|
||||||
}break;
|
}break;
|
||||||
case SHADOW_DEMON:
|
case SHADOW_DEMON:
|
||||||
if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true)) // only on players.
|
if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true)) // only on players.
|
||||||
{
|
{
|
||||||
summon->AddThreat(target, 5000000.0f);
|
summon->AddThreat(target, 5000000.0f);
|
||||||
summon->AI()->AttackStart(target);
|
summon->AI()->AttackStart(target);
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
|
|||||||
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
|
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
|
||||||
break;
|
break;
|
||||||
case EVENT_SWITCH_TARGET:
|
case EVENT_SWITCH_TARGET:
|
||||||
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true))
|
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
|
||||||
{
|
{
|
||||||
DoResetThreat();
|
DoResetThreat();
|
||||||
m_creature->AddThreat(target, 5000000.0f);
|
m_creature->AddThreat(target, 5000000.0f);
|
||||||
@@ -208,7 +208,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
|
|||||||
break;
|
break;
|
||||||
case EVENT_VOLCANO:
|
case EVENT_VOLCANO:
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
|
||||||
if(!target) target = m_creature->getVictim();
|
if(!target) target = m_creature->getVictim();
|
||||||
if(target)
|
if(target)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
|
|||||||
{
|
{
|
||||||
//m_creature->CastSpell(m_creature, SPELL_NEEDLE_SPINE, true);
|
//m_creature->CastSpell(m_creature, SPELL_NEEDLE_SPINE, true);
|
||||||
std::list<Unit*> target;
|
std::list<Unit*> target;
|
||||||
SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 80, true);
|
SelectTargetList(target, 3, SELECT_TARGET_RANDOM, 80, true);
|
||||||
for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
|
for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
|
||||||
m_creature->CastSpell(*i, 39835, true);
|
m_creature->CastSpell(*i, 39835, true);
|
||||||
events.ScheduleEvent(EVENT_NEEDLE, 15000+rand()%10000, GCD_CAST);
|
events.ScheduleEvent(EVENT_NEEDLE, 15000+rand()%10000, GCD_CAST);
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
|
|||||||
|
|
||||||
if(SwarmTimer < diff)
|
if(SwarmTimer < diff)
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
|
||||||
if(target)
|
if(target)
|
||||||
DoCast(target,SPELL_CARRION_SWARM);
|
DoCast(target,SPELL_CARRION_SWARM);
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
|
|||||||
{
|
{
|
||||||
for(uint8 i=0;i<3;++i)
|
for(uint8 i=0;i<3;++i)
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
|
||||||
if(target)
|
if(target)
|
||||||
target->CastSpell(target,SPELL_SLEEP,true);
|
target->CastSpell(target,SPELL_SLEEP,true);
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
|
|||||||
}else AuraTimer -= diff;
|
}else AuraTimer -= diff;
|
||||||
if(InfernoTimer < diff)
|
if(InfernoTimer < diff)
|
||||||
{
|
{
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_INFERNO);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,100,true), SPELL_INFERNO);
|
||||||
InfernoTimer = 45000;
|
InfernoTimer = 45000;
|
||||||
switch(rand()%2)
|
switch(rand()%2)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -140,13 +140,13 @@ struct TRINITY_DLL_DECL boss_azgalorAI : public hyjal_trashAI
|
|||||||
|
|
||||||
if(RainTimer < diff)
|
if(RainTimer < diff)
|
||||||
{
|
{
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE);
|
||||||
RainTimer = 20000+rand()%15000;
|
RainTimer = 20000+rand()%15000;
|
||||||
}else RainTimer -= diff;
|
}else RainTimer -= diff;
|
||||||
|
|
||||||
if(DoomTimer < diff)
|
if(DoomTimer < diff)
|
||||||
{
|
{
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank
|
||||||
DoomTimer = 45000+rand()%5000;
|
DoomTimer = 45000+rand()%5000;
|
||||||
}else DoomTimer -= diff;
|
}else DoomTimer -= diff;
|
||||||
|
|
||||||
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL mob_lesser_doomguardAI : public hyjal_trashAI
|
|||||||
|
|
||||||
if(CrippleTimer < diff)
|
if(CrippleTimer < diff)
|
||||||
{
|
{
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_CRIPPLE);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,100,true), SPELL_CRIPPLE);
|
||||||
CrippleTimer = 25000+rand()%5000;
|
CrippleTimer = 25000+rand()%5000;
|
||||||
}else CrippleTimer -= diff;
|
}else CrippleTimer -= diff;
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ struct TRINITY_DLL_DECL boss_rage_winterchillAI : public hyjal_trashAI
|
|||||||
}else NovaTimer -= diff;
|
}else NovaTimer -= diff;
|
||||||
if(IceboltTimer < diff)
|
if(IceboltTimer < diff)
|
||||||
{
|
{
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,40,true), SPELL_ICEBOLT);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,40,true), SPELL_ICEBOLT);
|
||||||
IceboltTimer = 11000+rand()%20000;
|
IceboltTimer = 11000+rand()%20000;
|
||||||
}else IceboltTimer -= diff;
|
}else IceboltTimer -= diff;
|
||||||
|
|
||||||
|
|||||||
@@ -724,7 +724,7 @@ struct mob_necromancerAI : public hyjal_trashAI
|
|||||||
|
|
||||||
void JustSummoned(Creature* summon)
|
void JustSummoned(Creature* summon)
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,30,true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,30,true);
|
||||||
if(target && summon)
|
if(target && summon)
|
||||||
summon->Attack(target,false);
|
summon->Attack(target,false);
|
||||||
summons.Summon(summon);
|
summons.Summon(summon);
|
||||||
|
|||||||
+1
-1
@@ -322,7 +322,7 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
|
|||||||
|
|
||||||
if(WaterboltTimer < diff)
|
if(WaterboltTimer < diff)
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
|
Unit* target = SelectTarget(SELECT_TARGET_NEAREST,0,14,true);
|
||||||
if(!target)
|
if(!target)
|
||||||
{
|
{
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM,0);
|
target = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||||
|
|||||||
+2
-2
@@ -235,7 +235,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
|
|||||||
for(uint8 i = 0; i < 4; i++)
|
for(uint8 i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
counter = 0;
|
counter = 0;
|
||||||
do{target = SelectUnit(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
|
do{target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
|
||||||
if(counter < Playercount)
|
if(counter < Playercount)
|
||||||
break;
|
break;
|
||||||
if(target) itr = list.find(target->GetGUID());
|
if(target) itr = list.find(target->GetGUID());
|
||||||
@@ -272,7 +272,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
|
|||||||
for (int8 g = 0; g < 4; g++) //one unit cant cast more than one spell per update, so some players have to cast for us XD
|
for (int8 g = 0; g < 4; g++) //one unit cant cast more than one spell per update, so some players have to cast for us XD
|
||||||
{
|
{
|
||||||
counter = 0;
|
counter = 0;
|
||||||
do {globuletarget = SelectUnit(SELECT_TARGET_RANDOM, 0,50,true);
|
do {globuletarget = SelectTarget(SELECT_TARGET_RANDOM, 0,50,true);
|
||||||
if(globuletarget) itr = globulelist.find(globuletarget->GetGUID());
|
if(globuletarget) itr = globulelist.find(globuletarget->GetGUID());
|
||||||
if (counter > Playercount)
|
if (counter > Playercount)
|
||||||
break;
|
break;
|
||||||
|
|||||||
+1
-1
@@ -165,7 +165,7 @@ struct TRINITY_DLL_DECL boss_the_black_stalkerAI : public ScriptedAI
|
|||||||
// Static Charge
|
// Static Charge
|
||||||
if(StaticCharge_Timer < diff)
|
if(StaticCharge_Timer < diff)
|
||||||
{
|
{
|
||||||
if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0,30,true))
|
if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM,0,30,true))
|
||||||
DoCast(target, SPELL_STATIC_CHARGE);
|
DoCast(target, SPELL_STATIC_CHARGE);
|
||||||
StaticCharge_Timer = 10000;
|
StaticCharge_Timer = 10000;
|
||||||
}else StaticCharge_Timer -= diff;
|
}else StaticCharge_Timer -= diff;
|
||||||
|
|||||||
@@ -30,8 +30,9 @@ EndScriptData */
|
|||||||
|
|
||||||
//Gothik
|
//Gothik
|
||||||
#define SPELL_HARVESTSOUL 28679
|
#define SPELL_HARVESTSOUL 28679
|
||||||
#define SPELL_SHADOWBOLT 29317
|
#define SPELL_SHADOWBOLT HEROIC(29317,56405)
|
||||||
#define H_SPELL_SHADOWBOLT 56405
|
#define SPELL_SOUL_SIPHON 43591 // cannot find the correct spell
|
||||||
|
|
||||||
//Unrelenting Trainee
|
//Unrelenting Trainee
|
||||||
#define SPELL_EAGLECLAW 30285
|
#define SPELL_EAGLECLAW 30285
|
||||||
#define SPELL_KNOCKDOWN_PASSIVE 6961
|
#define SPELL_KNOCKDOWN_PASSIVE 6961
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
|
|||||||
case 2:{
|
case 2:{
|
||||||
error_log("Summon Vapor case 2");
|
error_log("Summon Vapor case 2");
|
||||||
Unit* target;
|
Unit* target;
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||||
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
||||||
if(target)
|
if(target)
|
||||||
{
|
{
|
||||||
@@ -331,7 +331,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
|
|||||||
error_log("Summon Vapor case3");
|
error_log("Summon Vapor case3");
|
||||||
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
|
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
|
||||||
Unit* target;
|
Unit* target;
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||||
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
||||||
if(target)
|
if(target)
|
||||||
{
|
{
|
||||||
@@ -358,7 +358,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
|
|||||||
break;
|
break;
|
||||||
case 5:{
|
case 5:{
|
||||||
Unit* target;
|
Unit* target;
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
|
||||||
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
|
||||||
if(target)
|
if(target)
|
||||||
{
|
{
|
||||||
@@ -471,7 +471,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
|
|||||||
Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000;
|
Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000;
|
||||||
break;
|
break;
|
||||||
case EVENT_ENCAPSULATE:
|
case EVENT_ENCAPSULATE:
|
||||||
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true))
|
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
|
||||||
{
|
{
|
||||||
m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
|
m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
|
||||||
target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack
|
target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack
|
||||||
|
|||||||
@@ -540,7 +540,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
|
|||||||
float x,y,z;
|
float x,y,z;
|
||||||
Unit* target;
|
Unit* target;
|
||||||
for(uint8 z = 0; z < 6; ++z){
|
for(uint8 z = 0; z < 6; ++z){
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
|
||||||
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
||||||
}
|
}
|
||||||
target->GetPosition(x,y,z);
|
target->GetPosition(x,y,z);
|
||||||
@@ -584,7 +584,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
|
|||||||
if(!m_creature->IsNonMeleeSpellCasted(false)){
|
if(!m_creature->IsNonMeleeSpellCasted(false)){
|
||||||
m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
|
m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
|
||||||
for(uint8 z = 0; z < 6; ++z){
|
for(uint8 z = 0; z < 6; ++z){
|
||||||
randomPlayer = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
|
randomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
|
||||||
if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
||||||
}
|
}
|
||||||
if(randomPlayer)DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false);
|
if(randomPlayer)DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false);
|
||||||
@@ -658,7 +658,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
|
|||||||
case TIMER_ARMAGEDDON: //Phase 4
|
case TIMER_ARMAGEDDON: //Phase 4
|
||||||
Unit* target;
|
Unit* target;
|
||||||
for(uint8 z = 0; z < 6; ++z){
|
for(uint8 z = 0; z < 6; ++z){
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
|
||||||
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
|
||||||
}
|
}
|
||||||
if(target){
|
if(target){
|
||||||
@@ -1199,7 +1199,7 @@ struct TRINITY_DLL_DECL mob_sinster_reflectionAI : public ScriptedAI
|
|||||||
Timer[1] = 4000;
|
Timer[1] = 4000;
|
||||||
}
|
}
|
||||||
if(Timer[2] < diff){
|
if(Timer[2] < diff){
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true);
|
||||||
Timer[2] = 3000;
|
Timer[2] = 3000;
|
||||||
}
|
}
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
|
|||||||
m_creature->SummonCreature(CREATURE_DARK_FIENDS, x,y,z,o, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
m_creature->SummonCreature(CREATURE_DARK_FIENDS, x,y,z,o, TEMPSUMMON_CORPSE_DESPAWN, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
|
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
|
||||||
Summons.Summon(summoned);
|
Summons.Summon(summoned);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,10 +180,10 @@ struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
|
|||||||
}else EnrageTimer -= diff;
|
}else EnrageTimer -= diff;
|
||||||
|
|
||||||
if(BlackHoleSummonTimer < diff){
|
if(BlackHoleSummonTimer < diff){
|
||||||
Unit* random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
|
Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
|
||||||
if(!random)return;
|
if(!random)return;
|
||||||
DoCast(random, SPELL_DARKNESS_E, false);
|
DoCast(random, SPELL_DARKNESS_E, false);
|
||||||
random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
|
random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
|
||||||
if(!random)return;
|
if(!random)return;
|
||||||
random->CastSpell(random, SPELL_BLACKHOLE, false);
|
random->CastSpell(random, SPELL_BLACKHOLE, false);
|
||||||
BlackHoleSummonTimer = 15000;
|
BlackHoleSummonTimer = 15000;
|
||||||
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_muruAI : public Scripted_NoMovementAI
|
|||||||
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
|
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
|
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
|
||||||
Summons.Summon(summoned);
|
Summons.Summon(summoned);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -441,7 +441,7 @@ struct TRINITY_DLL_DECL npc_dark_fiendAI : public ScriptedAI
|
|||||||
if(!InAction){
|
if(!InAction){
|
||||||
m_creature->clearUnitState(UNIT_STAT_STUNNED);
|
m_creature->clearUnitState(UNIT_STAT_STUNNED);
|
||||||
DoCastAOE(SPELL_DARKFIEND_SKIN, false);
|
DoCastAOE(SPELL_DARKFIEND_SKIN, false);
|
||||||
AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true));
|
AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true));
|
||||||
InAction = true;
|
InAction = true;
|
||||||
WaitTimer = 500;
|
WaitTimer = 500;
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
|
|||||||
|
|
||||||
if(Charge_Timer < diff)
|
if(Charge_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit *target= SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_CHARGE), true);
|
Unit *target= SelectTarget(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_CHARGE), true);
|
||||||
if(target)
|
if(target)
|
||||||
DoCast(target, SPELL_CHARGE);
|
DoCast(target, SPELL_CHARGE);
|
||||||
Charge_Timer = 30000;
|
Charge_Timer = 30000;
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
|
|||||||
if( Wrath_Timer < diff)
|
if( Wrath_Timer < diff)
|
||||||
{
|
{
|
||||||
m_creature->InterruptNonMeleeSpells(false);
|
m_creature->InterruptNonMeleeSpells(false);
|
||||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_WRATH_OF_THE_ASTROMANCER, true);
|
DoCast(SelectTarget(SELECT_TARGET_RANDOM,1,100,true), SPELL_WRATH_OF_THE_ASTROMANCER, true);
|
||||||
Wrath_Timer = 20000+rand()%5000;
|
Wrath_Timer = 20000+rand()%5000;
|
||||||
}else Wrath_Timer -= diff;
|
}else Wrath_Timer -= diff;
|
||||||
|
|
||||||
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
|
|||||||
|
|
||||||
if (MarkOfTheAstromancer_Timer < diff) //A debuff that lasts for 5 seconds, cast several times each phase on a random raid member, but not the main tank
|
if (MarkOfTheAstromancer_Timer < diff) //A debuff that lasts for 5 seconds, cast several times each phase on a random raid member, but not the main tank
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
|
||||||
if(target)
|
if(target)
|
||||||
DoCast(target, SPELL_MARK_OF_THE_ASTROMANCER);
|
DoCast(target, SPELL_MARK_OF_THE_ASTROMANCER);
|
||||||
else DoCast(m_creature->getVictim(), SPELL_MARK_OF_THE_ASTROMANCER);
|
else DoCast(m_creature->getVictim(), SPELL_MARK_OF_THE_ASTROMANCER);
|
||||||
|
|||||||
@@ -804,7 +804,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
|
|||||||
|
|
||||||
if (FlameStrike_Timer < diff)
|
if (FlameStrike_Timer < diff)
|
||||||
{
|
{
|
||||||
if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true))
|
if (Unit* pUnit = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true))
|
||||||
DoCast(pUnit, SPELL_FLAME_STRIKE);
|
DoCast(pUnit, SPELL_FLAME_STRIKE);
|
||||||
|
|
||||||
FlameStrike_Timer = 30000;
|
FlameStrike_Timer = 30000;
|
||||||
@@ -816,7 +816,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
|
|||||||
for (uint32 i = 0; i < 3; i++)
|
for (uint32 i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
Unit* target =SelectUnit(SELECT_TARGET_RANDOM, 1, 70, true);
|
Unit* target =SelectTarget(SELECT_TARGET_RANDOM, 1, 70, true);
|
||||||
if(!target) target = m_creature->getVictim();
|
if(!target) target = m_creature->getVictim();
|
||||||
debug_log("TSCR: Kael'Thas mind control not supported.");
|
debug_log("TSCR: Kael'Thas mind control not supported.");
|
||||||
if(target)
|
if(target)
|
||||||
@@ -1080,7 +1080,7 @@ struct TRINITY_DLL_DECL boss_thaladred_the_darkenerAI : public advisorbase_ai
|
|||||||
//Gaze_Timer
|
//Gaze_Timer
|
||||||
if(Gaze_Timer < diff)
|
if(Gaze_Timer < diff)
|
||||||
{
|
{
|
||||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true))
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||||
{
|
{
|
||||||
DoResetThreat();
|
DoResetThreat();
|
||||||
if(target)
|
if(target)
|
||||||
|
|||||||
@@ -465,7 +465,7 @@ struct TRINITY_DLL_DECL boss_veknilashAI : public boss_twinemperorsAI
|
|||||||
|
|
||||||
if (UpperCut_Timer < diff)
|
if (UpperCut_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit* randomMelee = SelectUnit(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true);
|
Unit* randomMelee = SelectTarget(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true);
|
||||||
if (randomMelee)
|
if (randomMelee)
|
||||||
DoCast(randomMelee,SPELL_UPPERCUT);
|
DoCast(randomMelee,SPELL_UPPERCUT);
|
||||||
UpperCut_Timer = 15000+rand()%15000;
|
UpperCut_Timer = 15000+rand()%15000;
|
||||||
@@ -560,7 +560,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
|
|||||||
if (Blizzard_Timer < diff)
|
if (Blizzard_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit* target = NULL;
|
Unit* target = NULL;
|
||||||
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 45, true);
|
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45, true);
|
||||||
if (target)
|
if (target)
|
||||||
DoCast(target,SPELL_BLIZZARD);
|
DoCast(target,SPELL_BLIZZARD);
|
||||||
Blizzard_Timer = 15000+rand()%15000;
|
Blizzard_Timer = 15000+rand()%15000;
|
||||||
@@ -569,7 +569,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
|
|||||||
if (ArcaneBurst_Timer < diff)
|
if (ArcaneBurst_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit *mvic;
|
Unit *mvic;
|
||||||
if ((mvic=SelectUnit(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true))!=NULL)
|
if ((mvic=SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true))!=NULL)
|
||||||
{
|
{
|
||||||
DoCast(mvic,SPELL_ARCANEBURST);
|
DoCast(mvic,SPELL_ARCANEBURST);
|
||||||
ArcaneBurst_Timer = 5000;
|
ArcaneBurst_Timer = 5000;
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ElectricalStorm_Timer < diff) {
|
if (ElectricalStorm_Timer < diff) {
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50, true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true);
|
||||||
if(!target)
|
if(!target)
|
||||||
{
|
{
|
||||||
EnterEvadeMode();
|
EnterEvadeMode();
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
|
|||||||
|
|
||||||
if(SiphonSoul_Timer < diff)
|
if(SiphonSoul_Timer < diff)
|
||||||
{
|
{
|
||||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true);
|
||||||
Unit *trigger = DoSpawnCreature(MOB_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
|
Unit *trigger = DoSpawnCreature(MOB_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
|
||||||
if(!target || !trigger)
|
if(!target || !trigger)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
|
|||||||
{
|
{
|
||||||
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
|
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
|
||||||
DoPlaySoundToSet(m_creature, SOUND_YELL_SURGE);
|
DoPlaySoundToSet(m_creature, SOUND_YELL_SURGE);
|
||||||
Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_SURGE), true);
|
Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_SURGE), true);
|
||||||
if(target)
|
if(target)
|
||||||
DoCast(target, SPELL_SURGE);
|
DoCast(target, SPELL_SURGE);
|
||||||
Surge_Timer = 15000 + rand()%5000;
|
Surge_Timer = 15000 + rand()%5000;
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ void CreatureAI::OnCharmed(bool apply)
|
|||||||
me->IsAIEnabled = false;
|
me->IsAIEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AISpellInfoType *AISpellInfo;
|
||||||
|
|
||||||
void CreatureAI::DoZoneInCombat(Creature* creature)
|
void CreatureAI::DoZoneInCombat(Creature* creature)
|
||||||
{
|
{
|
||||||
if (!creature)
|
if (!creature)
|
||||||
@@ -151,6 +153,148 @@ void CreatureAI::EnterEvadeMode()
|
|||||||
me->GetMotionMaster()->MoveTargetedHome();
|
me->GetMotionMaster()->MoveTargetedHome();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool SelectTargetHelper(const Unit * me, const Unit * target, const bool &playerOnly, const float &dist, const int32 &aura)
|
||||||
|
{
|
||||||
|
if(playerOnly && target->GetTypeId() != TYPEID_PLAYER)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(dist && !me->IsWithinCombatRange(target, dist))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(aura)
|
||||||
|
{
|
||||||
|
if(aura > 0)
|
||||||
|
{
|
||||||
|
if(!target->HasAura(aura))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(target->HasAura(aura))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TargetDistanceOrder : public std::binary_function<const Unit *, const Unit *, bool>
|
||||||
|
{
|
||||||
|
const Unit * me;
|
||||||
|
TargetDistanceOrder(const Unit* Target) : me(Target) {};
|
||||||
|
// functor for operator ">"
|
||||||
|
bool operator()(const Unit * _Left, const Unit * _Right) const
|
||||||
|
{
|
||||||
|
return (me->GetDistanceSq(_Left) < me->GetDistanceSq(_Right));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Unit* CreatureAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly, int32 aura)
|
||||||
|
{
|
||||||
|
if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
|
||||||
|
{
|
||||||
|
std::list<HostilReference*> &m_threatlist = me->getThreatManager().getThreatList();
|
||||||
|
if(position >= m_threatlist.size())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
std::list<Unit*> targetList;
|
||||||
|
for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
|
||||||
|
if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
|
||||||
|
targetList.push_back((*itr)->getTarget());
|
||||||
|
|
||||||
|
if(position >= targetList.size())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
targetList.sort(TargetDistanceOrder(m_creature));
|
||||||
|
|
||||||
|
if(targetType == SELECT_TARGET_NEAREST)
|
||||||
|
{
|
||||||
|
std::list<Unit*>::iterator i = targetList.begin();
|
||||||
|
advance(i, position);
|
||||||
|
return *i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::list<Unit*>::reverse_iterator i = targetList.rbegin();
|
||||||
|
advance(i, position);
|
||||||
|
return *i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList();
|
||||||
|
std::list<HostilReference*>::iterator i;
|
||||||
|
while(position < m_threatlist.size())
|
||||||
|
{
|
||||||
|
if(targetType == SELECT_TARGET_BOTTOMAGGRO)
|
||||||
|
{
|
||||||
|
i = m_threatlist.end();
|
||||||
|
advance(i, - (int32)position - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = m_threatlist.begin();
|
||||||
|
if(targetType == SELECT_TARGET_TOPAGGRO)
|
||||||
|
advance(i, position);
|
||||||
|
else // random
|
||||||
|
advance(i, position + rand()%(m_threatlist.size() - position));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura))
|
||||||
|
return (*i)->getTarget();
|
||||||
|
else
|
||||||
|
m_threatlist.erase(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureAI::SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly, int32 aura)
|
||||||
|
{
|
||||||
|
if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
|
||||||
|
{
|
||||||
|
std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
|
||||||
|
if(m_threatlist.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
|
||||||
|
if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura))
|
||||||
|
targetList.push_back((*itr)->getTarget());
|
||||||
|
|
||||||
|
targetList.sort(TargetDistanceOrder(me));
|
||||||
|
targetList.resize(num);
|
||||||
|
if(targetType == SELECT_TARGET_FARTHEST)
|
||||||
|
targetList.reverse();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList();
|
||||||
|
std::list<HostilReference*>::iterator i;
|
||||||
|
while(!m_threatlist.empty() && num)
|
||||||
|
{
|
||||||
|
if(targetType == SELECT_TARGET_BOTTOMAGGRO)
|
||||||
|
{
|
||||||
|
i = m_threatlist.end();
|
||||||
|
--i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = m_threatlist.begin();
|
||||||
|
if(targetType == SELECT_TARGET_RANDOM)
|
||||||
|
advance(i, rand()%m_threatlist.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura))
|
||||||
|
{
|
||||||
|
targetList.push_back((*i)->getTarget());
|
||||||
|
--num;
|
||||||
|
}
|
||||||
|
m_threatlist.erase(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/)
|
void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/)
|
||||||
{
|
{
|
||||||
Creature *charmer = (Creature*)me->GetCharmer();
|
Creature *charmer = (Creature*)me->GetCharmer();
|
||||||
|
|||||||
+33
-1
@@ -37,7 +37,7 @@ struct SpellEntry;
|
|||||||
#define VISIBILITY_RANGE 10000
|
#define VISIBILITY_RANGE 10000
|
||||||
|
|
||||||
//Spell targets used by SelectSpell
|
//Spell targets used by SelectSpell
|
||||||
enum SelectTarget
|
enum SelectTargetType
|
||||||
{
|
{
|
||||||
SELECT_TARGET_DONTCARE = 0, //All target types allowed
|
SELECT_TARGET_DONTCARE = 0, //All target types allowed
|
||||||
|
|
||||||
@@ -77,6 +77,35 @@ enum SCEquip
|
|||||||
EQUIP_UNEQUIP = 0
|
EQUIP_UNEQUIP = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum AITarget
|
||||||
|
{
|
||||||
|
AITARGET_SELF,
|
||||||
|
AITARGET_VICTIM,
|
||||||
|
AITARGET_ENEMY,
|
||||||
|
AITARGET_ALLY,
|
||||||
|
AITARGET_BUFF,
|
||||||
|
AITARGET_DEBUFF,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AICondition
|
||||||
|
{
|
||||||
|
AICOND_AGGRO,
|
||||||
|
AICOND_COMBAT,
|
||||||
|
AICOND_DIE,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define AI_DEFAULT_COOLDOWN 5000
|
||||||
|
|
||||||
|
struct AISpellInfoType
|
||||||
|
{
|
||||||
|
AISpellInfoType() : target(AITARGET_SELF), condition(AICOND_COMBAT), cooldown(AI_DEFAULT_COOLDOWN) {}
|
||||||
|
AITarget target;
|
||||||
|
AICondition condition;
|
||||||
|
uint32 cooldown;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern AISpellInfoType *AISpellInfo;
|
||||||
|
|
||||||
class EventMap : private std::map<uint32, uint32>
|
class EventMap : private std::map<uint32, uint32>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@@ -273,6 +302,9 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI
|
|||||||
|
|
||||||
// Pointer to controlled by AI creature
|
// Pointer to controlled by AI creature
|
||||||
//Creature* const m_creature;
|
//Creature* const m_creature;
|
||||||
|
|
||||||
|
Unit* SelectTarget(SelectAggroTarget target, uint32 position = 0, float dist = 0, bool playerOnly = false, int32 aura = 0);
|
||||||
|
void SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget target, float dist = 0, bool playerOnly = false, int32 aura = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature>
|
struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature>
|
||||||
|
|||||||
@@ -1194,6 +1194,14 @@ float WorldObject::GetDistanceSq(const float &x, const float &y, const float &z)
|
|||||||
return dx*dx + dy*dy + dz*dz;
|
return dx*dx + dy*dy + dz*dz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float WorldObject::GetDistanceSq(const WorldObject *obj) const
|
||||||
|
{
|
||||||
|
float dx = GetPositionX() - obj->GetPositionX();
|
||||||
|
float dy = GetPositionY() - obj->GetPositionY();
|
||||||
|
float dz = GetPositionZ() - obj->GetPositionZ();
|
||||||
|
return dx*dx + dy*dy + dz*dz;
|
||||||
|
}
|
||||||
|
|
||||||
float WorldObject::GetDistance2d(const WorldObject* obj) const
|
float WorldObject::GetDistance2d(const WorldObject* obj) const
|
||||||
{
|
{
|
||||||
float dx = GetPositionX() - obj->GetPositionX();
|
float dx = GetPositionX() - obj->GetPositionX();
|
||||||
|
|||||||
@@ -463,6 +463,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
|
|||||||
float GetDistance( const WorldObject* obj ) const;
|
float GetDistance( const WorldObject* obj ) const;
|
||||||
float GetDistance(const float x, const float y, const float z) const;
|
float GetDistance(const float x, const float y, const float z) const;
|
||||||
float GetDistanceSq(const float &x, const float &y, const float &z) const;
|
float GetDistanceSq(const float &x, const float &y, const float &z) const;
|
||||||
|
float GetDistanceSq(const WorldObject *obj) const;
|
||||||
float GetDistance2d(const WorldObject* obj) const;
|
float GetDistance2d(const WorldObject* obj) const;
|
||||||
float GetDistance2d(const float x, const float y) const;
|
float GetDistance2d(const float x, const float y) const;
|
||||||
float GetExactDistance2d(const float x, const float y) const;
|
float GetExactDistance2d(const float x, const float y) const;
|
||||||
|
|||||||
+2
-2
@@ -413,7 +413,7 @@ void Unit::resetAttackTimer(WeaponAttackType type)
|
|||||||
m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]);
|
m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsWithinCombatRange(Unit *obj, float dist2compare) const
|
bool Unit::IsWithinCombatRange(const Unit *obj, float dist2compare) const
|
||||||
{
|
{
|
||||||
if (!obj || !IsInMap(obj)) return false;
|
if (!obj || !IsInMap(obj)) return false;
|
||||||
|
|
||||||
@@ -428,7 +428,7 @@ bool Unit::IsWithinCombatRange(Unit *obj, float dist2compare) const
|
|||||||
return distsq < maxdist * maxdist;
|
return distsq < maxdist * maxdist;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsWithinMeleeRange(Unit *obj, float dist) const
|
bool Unit::IsWithinMeleeRange(const Unit *obj, float dist) const
|
||||||
{
|
{
|
||||||
if (!obj || !IsInMap(obj)) return false;
|
if (!obj || !IsInMap(obj)) return false;
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -940,8 +940,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
void SetCanDualWield(bool value) { m_canDualWield = value; }
|
void SetCanDualWield(bool value) { m_canDualWield = value; }
|
||||||
float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; }
|
float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; }
|
||||||
float GetMeleeReach() const { float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
|
float GetMeleeReach() const { float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
|
||||||
bool IsWithinCombatRange(Unit *obj, float dist2compare) const;
|
bool IsWithinCombatRange(const Unit *obj, float dist2compare) const;
|
||||||
bool IsWithinMeleeRange(Unit *obj, float dist = MELEE_RANGE) const;
|
bool IsWithinMeleeRange(const Unit *obj, float dist = MELEE_RANGE) const;
|
||||||
void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const;
|
void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const;
|
||||||
uint32 m_extraAttacks;
|
uint32 m_extraAttacks;
|
||||||
bool m_canDualWield;
|
bool m_canDualWield;
|
||||||
|
|||||||
Reference in New Issue
Block a user