aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp150
-rw-r--r--src/bindings/scripts/include/sc_creature.h4
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp5
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp2
-rw-r--r--src/game/BattleGround.cpp75
-rw-r--r--src/game/BattleGround.h4
-rw-r--r--src/game/Creature.h16
-rw-r--r--src/game/CreatureAI.cpp144
-rw-r--r--src/game/CreatureAI.h34
-rw-r--r--src/game/GridNotifiers.h59
-rw-r--r--src/game/Level3.cpp6
-rw-r--r--src/game/Object.cpp8
-rw-r--r--src/game/Object.h1
-rw-r--r--src/game/Player.cpp29
-rw-r--r--src/game/Player.h2
-rw-r--r--src/game/SharedDefines.h1
-rw-r--r--src/game/Spell.cpp51
-rw-r--r--src/game/Spell.h2
-rw-r--r--src/game/SpellAuras.cpp19
-rw-r--r--src/game/SpellEffects.cpp36
-rw-r--r--src/game/Unit.cpp4
-rw-r--r--src/game/Unit.h4
43 files changed, 425 insertions, 327 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index 82743bcd9e5..4a9f8ec61e8 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -259,147 +259,7 @@ Unit* ScriptedAI::SelectUnit(SelectAggroTarget target, uint32 position)
return NULL;
}
-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->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)
+SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTargetType Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effects)
{
//No target so we can't cast
if (!Target)
@@ -531,7 +391,7 @@ void FillSpellSummary()
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].Targets = 0;
@@ -541,7 +401,7 @@ void FillSpellSummary()
if (!TempSpell)
continue;
- for (int j=0; j<3; j++)
+ for(uint32 j = 0; j < 3; ++j)
{
//Spell targets self
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_UNIT_CASTER )
@@ -802,10 +662,6 @@ void LoadOverridenDBCData()
if(spellInfo = SPELL(41913))
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
if(spellInfo = SPELL(28531))
{
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index c2c93a520a9..44caf063162 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -227,13 +227,11 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//Selects a unit from the creature's current aggro list
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; }
//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
bool CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered = false);
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
index 89fd75b9bc8..52e5a3e8915 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
@@ -262,7 +262,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
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)
{
DoCast(target,SPELL_BANISH);
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
index 99bce54be62..599767b591f 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
@@ -118,7 +118,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
// Murmur's Touch
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);
MurmursTouch_Timer = 25000 + rand()%10000;
}else MurmursTouch_Timer -= diff;
@@ -162,7 +162,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
// Sonic Shock
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())
DoCast(target, SPELL_SONIC_SHOCK);
SonicShock_Timer = 10000+rand()%10000;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index 60c51f0be33..68431cb81ee 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -785,7 +785,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
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);
Timer[EVENT_PARASITIC_SHADOWFIEND] = 35000 + rand()%10000;
}break;
@@ -907,7 +907,7 @@ struct TRINITY_DLL_DECL flame_of_azzinothAI : public ScriptedAI
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)))
{
m_creature->AddThreat(target, 5000000.0f);
@@ -1765,7 +1765,7 @@ struct TRINITY_DLL_DECL mob_parasitic_shadowfiendAI : public ScriptedAI
{
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);
else
{
@@ -1862,15 +1862,15 @@ void boss_illidan_stormrageAI::JustSummoned(Creature* summon)
summon->setDeathState(JUST_DIED);
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)
|| target->HasAura(SPELL_PARASITIC_SHADOWFIEND2))
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
if(target)
summon->AI()->AttackStart(target);
}break;
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->AI()->AttackStart(target);
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
index c01db75bd58..fdfdef396bb 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
@@ -198,7 +198,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
break;
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();
m_creature->AddThreat(target, 5000000.0f);
@@ -208,7 +208,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
break;
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)
{
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
index 7d6b7140a9d..032bccc57ed 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
@@ -171,7 +171,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
//m_creature->CastSpell(m_creature, SPELL_NEEDLE_SPINE, true);
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)
m_creature->CastSpell(*i, 39835, true);
events.ScheduleEvent(EVENT_NEEDLE, 15000+rand()%10000, GCD_CAST);
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
index 21b39fa378b..13b0c78ebc1 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
@@ -148,7 +148,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
if(SwarmTimer < diff)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
if(target)
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)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
if(target)
target->CastSpell(target,SPELL_SLEEP,true);
}
@@ -194,7 +194,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
}else AuraTimer -= 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;
switch(rand()%2)
{
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
index 15085963b20..33e3d344da2 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
@@ -140,13 +140,13 @@ struct TRINITY_DLL_DECL boss_azgalorAI : public hyjal_trashAI
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;
}else RainTimer -= 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;
}else DoomTimer -= diff;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL mob_lesser_doomguardAI : public hyjal_trashAI
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;
}else CrippleTimer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
index addbddab5b8..3e6b2bc8e98 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
@@ -169,7 +169,7 @@ struct TRINITY_DLL_DECL boss_rage_winterchillAI : public hyjal_trashAI
}else NovaTimer -= 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;
}else IceboltTimer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
index 583c7831af5..30f0c14caaf 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
@@ -724,7 +724,7 @@ struct mob_necromancerAI : public hyjal_trashAI
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)
summon->Attack(target,false);
summons.Summon(summon);
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
index eb35a3c74b4..254a4d1d899 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
@@ -322,7 +322,7 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
if(WaterboltTimer < diff)
{
- Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
+ Unit* target = SelectTarget(SELECT_TARGET_NEAREST,0,14,true);
if(!target)
{
target = SelectUnit(SELECT_TARGET_RANDOM,0);
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
index cea591182d5..f8d27df5bb0 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
@@ -235,7 +235,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
for(uint8 i = 0; i < 4; i++)
{
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)
break;
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
{
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 (counter > Playercount)
break;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
index 370b07c8adc..72c7992e109 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
@@ -165,7 +165,7 @@ struct TRINITY_DLL_DECL boss_the_black_stalkerAI : public ScriptedAI
// Static Charge
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);
StaticCharge_Timer = 10000;
}else StaticCharge_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
index 0becff399da..3a9c6a5b47a 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
@@ -30,8 +30,9 @@ EndScriptData */
//Gothik
#define SPELL_HARVESTSOUL 28679
-#define SPELL_SHADOWBOLT 29317
-#define H_SPELL_SHADOWBOLT 56405
+#define SPELL_SHADOWBOLT HEROIC(29317,56405)
+#define SPELL_SOUL_SIPHON 43591 // cannot find the correct spell
+
//Unrelenting Trainee
#define SPELL_EAGLECLAW 30285
#define SPELL_KNOCKDOWN_PASSIVE 6961
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
index 8e42d074f88..e753d0b6047 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
@@ -306,7 +306,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
case 2:{
error_log("Summon Vapor case 2");
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)
{
@@ -331,7 +331,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
error_log("Summon Vapor case3");
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
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)
{
@@ -358,7 +358,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
break;
case 5:{
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)
{
@@ -471,7 +471,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000;
break;
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);
target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
index 98cbfda7a7f..a0bd75cb156 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
@@ -540,7 +540,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
float x,y,z;
Unit* target;
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;
}
target->GetPosition(x,y,z);
@@ -584,7 +584,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
if(!m_creature->IsNonMeleeSpellCasted(false)){
m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
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)DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false);
@@ -658,7 +658,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
case TIMER_ARMAGEDDON: //Phase 4
Unit* target;
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){
@@ -1199,7 +1199,7 @@ struct TRINITY_DLL_DECL mob_sinster_reflectionAI : public ScriptedAI
Timer[1] = 4000;
}
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;
}
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
index 6000ee474e0..b38607e1a7f 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
@@ -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);
break;
}
- summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
+ summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
@@ -180,10 +180,10 @@ struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
}else EnrageTimer -= 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;
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;
random->CastSpell(random, SPELL_BLACKHOLE, false);
BlackHoleSummonTimer = 15000;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_muruAI : public Scripted_NoMovementAI
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
break;
}
- summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
+ summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
@@ -441,7 +441,7 @@ struct TRINITY_DLL_DECL npc_dark_fiendAI : public ScriptedAI
if(!InAction){
m_creature->clearUnitState(UNIT_STAT_STUNNED);
DoCastAOE(SPELL_DARKFIEND_SKIN, false);
- AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true));
+ AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true));
InAction = true;
WaitTimer = 500;
}else{
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
index 168f0f48e3a..af44d96d417 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
@@ -352,7 +352,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
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)
DoCast(target, SPELL_CHARGE);
Charge_Timer = 30000;
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
index 83cb789b189..6af14eceeed 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
@@ -230,7 +230,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
if( Wrath_Timer < diff)
{
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;
}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
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
if(target)
DoCast(target, SPELL_MARK_OF_THE_ASTROMANCER);
else DoCast(m_creature->getVictim(), SPELL_MARK_OF_THE_ASTROMANCER);
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
index 6745c4fd9ec..7557e03f8e5 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
@@ -804,7 +804,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
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);
FlameStrike_Timer = 30000;
@@ -816,7 +816,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
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();
debug_log("TSCR: Kael'Thas mind control not supported.");
if(target)
@@ -1080,7 +1080,7 @@ struct TRINITY_DLL_DECL boss_thaladred_the_darkenerAI : public advisorbase_ai
//Gaze_Timer
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();
if(target)
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
index c3d4d0f35eb..d2fff0e569f 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
@@ -465,7 +465,7 @@ struct TRINITY_DLL_DECL boss_veknilashAI : public boss_twinemperorsAI
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)
DoCast(randomMelee,SPELL_UPPERCUT);
UpperCut_Timer = 15000+rand()%15000;
@@ -560,7 +560,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
if (Blizzard_Timer < diff)
{
Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 45, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45, true);
if (target)
DoCast(target,SPELL_BLIZZARD);
Blizzard_Timer = 15000+rand()%15000;
@@ -569,7 +569,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
if (ArcaneBurst_Timer < diff)
{
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);
ArcaneBurst_Timer = 5000;
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
index f31f944a3d4..85ba26ef20d 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
@@ -297,7 +297,7 @@ struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
}
if (ElectricalStorm_Timer < diff) {
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true);
if(!target)
{
EnterEvadeMode();
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
index 7fb8dc9b321..26229261905 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
@@ -383,7 +383,7 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
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);
if(!target || !trigger)
{
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
index 9fc50e621ac..68b92590025 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
@@ -406,7 +406,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
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)
DoCast(target, SPELL_SURGE);
Surge_Timer = 15000 + rand()%5000;
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index d179ec33691..7a6b96070a1 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -726,12 +726,10 @@ void BattleGround::EndBattleGround(uint32 winner)
if (team == winner)
{
RewardMark(plr,ITEM_WINNER_COUNT);
- RewardQuest(plr);
+ RewardQuestComplete(plr);
}
- else if(winner !=0)
- {
+ else if(winner)
RewardMark(plr,ITEM_LOSER_COUNT);
- }
plr->CombatStopWithPets(true);
@@ -785,13 +783,6 @@ uint32 BattleGround::GetBattlemasterEntry() const
void BattleGround::RewardMark(Player *plr,uint32 count)
{
- // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
- if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
- return;
-
- if(!plr || !count)
- return;
-
BattleGroundMarks mark;
switch(GetTypeID())
{
@@ -811,21 +802,53 @@ void BattleGround::RewardMark(Player *plr,uint32 count)
return;
}
- if ( objmgr.GetItemPrototype( mark ) )
+ //if (IsSpell)
+ // RewardSpellCast(plr,mark);
+ //else
+ RewardItem(plr,mark,count);
+}
+
+void BattleGround::RewardSpellCast(Player *plr, uint32 spell_id)
+{
+ // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
+ if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
+ return;
+
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
+ if(!spellInfo)
{
- ItemPosCountVec dest;
- uint32 no_space_count = 0;
- uint8 msg = plr->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, mark, count, &no_space_count );
- if( msg != EQUIP_ERR_OK ) // convert to possible store amount
- count -= no_space_count;
+ sLog.outError("Battleground reward casting spell %u not exist.",spell_id);
+ return;
+ }
- if(!dest.empty()) // can add some
- if(Item* item = plr->StoreNewItem( dest, mark, true, 0))
- plr->SendNewItem(item,count,false,true);
+ plr->CastSpell(plr, spellInfo, true);
+}
+
+void BattleGround::RewardItem(Player *plr, uint32 item_id, uint32 count)
+{
+ // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
+ if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
+ return;
- if (no_space_count > 0)
- SendRewardMarkByMail(plr,mark,no_space_count);
+ ItemPosCountVec dest;
+ uint32 no_space_count = 0;
+ uint8 msg = plr->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item_id, count, &no_space_count );
+
+ if( msg == EQUIP_ERR_ITEM_NOT_FOUND)
+ {
+ sLog.outErrorDb("Battleground reward item (Entry %u) not exist in `item_template`.",item_id);
+ return;
}
+
+ if( msg != EQUIP_ERR_OK ) // convert to possible store amount
+ count -= no_space_count;
+
+ if( count != 0 && !dest.empty()) // can add some
+ if (Item* item = plr->StoreNewItem( dest, item_id, true, 0))
+ plr->SendNewItem(item,count,false,true);
+
+ if (no_space_count > 0)
+ SendRewardMarkByMail(plr,item_id,no_space_count);
}
void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
@@ -865,12 +888,8 @@ void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
}
}
-void BattleGround::RewardQuest(Player *plr)
+void BattleGround::RewardQuestComplete(Player *plr)
{
- // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
- if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
- return;
-
uint32 quest;
switch(GetTypeID())
{
@@ -890,7 +909,7 @@ void BattleGround::RewardQuest(Player *plr)
return;
}
- plr->CastSpell(plr, quest, true);
+ RewardSpellCast(plr, quest);
}
void BattleGround::BlockMovement(Player *plr)
diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h
index 9788f264502..509ba6eb972 100644
--- a/src/game/BattleGround.h
+++ b/src/game/BattleGround.h
@@ -421,7 +421,9 @@ class BattleGround
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID);
void RewardMark(Player *plr,uint32 count);
void SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count);
- void RewardQuest(Player *plr);
+ void RewardItem(Player *plr, uint32 item_id, uint32 count);
+ void RewardQuestComplete(Player *plr);
+ void RewardSpellCast(Player *plr, uint32 spell_id);
void UpdateWorldState(uint32 Field, uint32 Value);
void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player *Source);
void EndBattleGround(uint32 winner);
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 36cfee78c5f..b90642547dd 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -108,6 +108,21 @@ enum Gossip_Guard_Skill
GOSSIP_GUARD_SKILL_ENGINERING = 91
};
+enum GossipOptionIcon
+{
+ GOSSIP_ICON_CHAT = 0, //white chat bubble
+ GOSSIP_ICON_VENDOR = 1, //brown bag
+ GOSSIP_ICON_TAXI = 2, //flight
+ GOSSIP_ICON_TRAINER = 3, //book
+ GOSSIP_ICON_INTERACT_1 = 4, //interaction wheel
+ GOSSIP_ICON_INTERACT_2 = 5, //interaction wheel
+ GOSSIP_ICON_MONEY_BAG = 6, //brown bag with yellow dot
+ GOSSIP_ICON_TALK = 7, //white chat bubble with black dots
+ GOSSIP_ICON_TABARD = 8, //tabard
+ GOSSIP_ICON_BATTLE = 9, //two swords
+ GOSSIP_ICON_DOT = 10 //yellow dot
+};
+
struct GossipOption
{
uint32 Id;
@@ -635,6 +650,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
bool IsVisibleInGridForPlayer(Player const* pl) const;
void RemoveCorpse();
+ bool isDeadByDefault() const { return m_isDeadByDefault; };
time_t const& GetRespawnTime() const { return m_respawnTime; }
time_t GetRespawnTimeEx() const;
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp
index 5cde80aaccb..0713ef592d3 100644
--- a/src/game/CreatureAI.cpp
+++ b/src/game/CreatureAI.cpp
@@ -71,6 +71,8 @@ void CreatureAI::OnCharmed(bool apply)
me->IsAIEnabled = false;
}
+AISpellInfoType *AISpellInfo;
+
void CreatureAI::DoZoneInCombat(Creature* creature)
{
if (!creature)
@@ -151,6 +153,148 @@ void CreatureAI::EnterEvadeMode()
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*/)
{
Creature *charmer = (Creature*)me->GetCharmer();
diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h
index e3a5a674e68..16271775728 100644
--- a/src/game/CreatureAI.h
+++ b/src/game/CreatureAI.h
@@ -37,7 +37,7 @@ struct SpellEntry;
#define VISIBILITY_RANGE 10000
//Spell targets used by SelectSpell
-enum SelectTarget
+enum SelectTargetType
{
SELECT_TARGET_DONTCARE = 0, //All target types allowed
@@ -77,6 +77,35 @@ enum SCEquip
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>
{
private:
@@ -273,6 +302,9 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI
// Pointer to controlled by AI 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>
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index 03d8ea11b16..195f7206264 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -499,6 +499,53 @@ namespace Trinity
// CHECKS && DO classes
// WorldObject check classes
+ class RaiseDeadObjectCheck
+ {
+ public:
+ RaiseDeadObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
+ bool operator()(Creature* u)
+ {
+ if (i_funit->GetTypeId()!=TYPEID_PLAYER || !((Player*)i_funit)->isHonorOrXPTarget(u) ||
+ u->getDeathState() != CORPSE || u->isDeadByDefault() || u->isInFlight() ||
+ ( u->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1)) )==0 ||
+ (u->GetDisplayId() != u->GetNativeDisplayId()))
+ return false;
+
+ return i_funit->IsWithinDistInMap(u, i_range);
+ }
+ template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
+ private:
+ Unit* const i_funit;
+ float i_range;
+ };
+
+ class ExplodeCorpseObjectCheck
+ {
+ public:
+ ExplodeCorpseObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
+ bool operator()(Player* u)
+ {
+ if (u->getDeathState()!=CORPSE || u->isInFlight() ||
+ u->HasAuraType(SPELL_AURA_GHOST) || (u->GetDisplayId() != u->GetNativeDisplayId()))
+ return false;
+
+ return i_funit->IsWithinDistInMap(u, i_range);
+ }
+ bool operator()(Creature* u)
+ {
+ if (u->getDeathState()!=CORPSE || u->isInFlight() || u->isDeadByDefault() ||
+ (u->GetDisplayId() != u->GetNativeDisplayId()) ||
+ (u->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)!=0)
+ return false;
+
+ return i_funit->IsWithinDistInMap(u, i_range);
+ }
+ template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
+ private:
+ Unit* const i_funit;
+ float i_range;
+ };
+
class CannibalizeObjectCheck
{
public:
@@ -508,22 +555,16 @@ namespace Trinity
if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() )
return false;
- if(i_funit->IsWithinDistInMap(u, i_range) )
- return true;
-
- return false;
+ return i_funit->IsWithinDistInMap(u, i_range);
}
bool operator()(Corpse* u);
bool operator()(Creature* u)
{
- if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
+ if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD)==0)
return false;
- if(i_funit->IsWithinDistInMap(u, i_range) )
- return true;
-
- return false;
+ return i_funit->IsWithinDistInMap(u, i_range);
}
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
private:
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index f4ec15bcfb0..9d43c348831 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -1612,11 +1612,7 @@ bool ChatHandler::HandleCooldownCommand(const char* args)
return false;
}
- WorldPacket data( SMSG_CLEAR_COOLDOWN, (4+8) );
- data << uint32(spell_id);
- data << uint64(target->GetGUID());
- target->GetSession()->SendPacket(&data);
- target->RemoveSpellCooldown(spell_id);
+ target->RemoveSpellCooldown(spell_id,true);
PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str());
}
return true;
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 6b7a3cdd4ac..a436732f0a6 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1194,6 +1194,14 @@ float WorldObject::GetDistanceSq(const float &x, const float &y, const float &z)
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 dx = GetPositionX() - obj->GetPositionX();
diff --git a/src/game/Object.h b/src/game/Object.h
index e7e03501dc1..01c31d5b9b4 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -463,6 +463,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
float GetDistance( const WorldObject* obj ) 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 WorldObject *obj) const;
float GetDistance2d(const WorldObject* obj) const;
float GetDistance2d(const float x, const float y) const;
float GetExactDistance2d(const float x, const float y) const;
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index bfd47aa8279..b3aad430b32 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -3289,6 +3289,20 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
}
}
+
+void Player::RemoveSpellCooldown( uint32 spell_id, bool update /* = false */ )
+{
+ m_spellCooldowns.erase(spell_id);
+
+ if(update)
+ {
+ WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
+ data << uint32(spell_id);
+ data << uint64(GetGUID());
+ SendDirectMessage(&data);
+ }
+}
+
void Player::RemoveArenaSpellCooldowns()
{
// remove cooldowns on spells that has < 15 min CD
@@ -9848,14 +9862,17 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
{
if( Item* pBag = GetItemByPos( INVENTORY_SLOT_BAG_0, i ) )
{
- if( ItemPrototype const* pBagProto = pBag->GetProto() )
+ if( pBag != pItem )
{
- if( pBagProto->Class==pProto->Class && (!swap || pBag->GetSlot() != eslot ) )
+ if( ItemPrototype const* pBagProto = pBag->GetProto() )
{
- if(pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
- return EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH;
- else
- return EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER;
+ if( pBagProto->Class==pProto->Class && (!swap || pBag->GetSlot() != eslot ) )
+ {
+ if(pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
+ return EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH;
+ else
+ return EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER;
+ }
}
}
}
diff --git a/src/game/Player.h b/src/game/Player.h
index be509972e71..b322209a6f5 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1384,7 +1384,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL);
void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs );
- void RemoveSpellCooldown(uint32 spell_id) { m_spellCooldowns.erase(spell_id); }
+ void RemoveSpellCooldown(uint32 spell_id, bool update = false);
void RemoveArenaSpellCooldowns();
void RemoveAllSpellCooldown();
void _LoadSpellCooldowns(QueryResult *result);
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 5a32744da7c..e592bebf1de 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -1820,6 +1820,7 @@ enum CreatureType
};
uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD = (1 << (CREATURE_TYPE_HUMANOID-1)) | (1 << (CREATURE_TYPE_UNDEAD-1));
+uint32 const CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL = (1 << (CREATURE_TYPE_MECHANICAL-1)) | (1 << (CREATURE_TYPE_ELEMENTAL-1));
// CreatureFamily.dbc
enum CreatureFamily
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 5b53647fe4c..b8b92cbbadf 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -476,6 +476,35 @@ Spell::~Spell()
delete m_spellValue;
}
+template<typename T>
+WorldObject* Spell::FindCorpseUsing()
+{
+ // non-standard target selection
+ float max_range = GetSpellMaxRange(m_spellInfo, false);
+
+ CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
+ Cell cell(p);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ WorldObject* result = NULL;
+
+ T u_check(m_caster, max_range);
+ MaNGOS::WorldObjectSearcher<T> searcher(m_caster, result, u_check);
+
+ TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, GridTypeMapContainer > grid_searcher(searcher);
+ CellLock<GridReadGuard> cell_lock(cell, p);
+ cell_lock->Visit(cell_lock, grid_searcher, *m_caster->GetMap());
+
+ if (!result)
+ {
+ TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, WorldTypeMapContainer > world_searcher(searcher);
+ cell_lock->Visit(cell_lock, world_searcher, *m_caster->GetMap());
+ }
+
+ return result;
+}
+
void Spell::FillTargetMap()
{
for(uint32 i = 0; i < 3; ++i)
@@ -535,17 +564,7 @@ void Spell::FillTargetMap()
{
case 20577: // Cannibalize
{
- // non-standard target selection
- SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
- float max_range = GetSpellMaxRangeForHostile(srange);
- WorldObject* result = NULL;
-
- Trinity::CannibalizeObjectCheck u_check(m_caster, max_range);
- Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck > searcher(m_caster, result, u_check);
- m_caster->VisitNearbyGridObject(max_range, searcher);
- if(!result)
- m_caster->VisitNearbyWorldObject(max_range, searcher);
-
+ WorldObject* result = FindCorpseUsing<MaNGOS::CannibalizeObjectCheck> ();
if(result)
{
@@ -566,15 +585,7 @@ void Spell::FillTargetMap()
{
// clear cooldown at fail
if(m_caster->GetTypeId()==TYPEID_PLAYER)
- {
- ((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(m_spellInfo->Id);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
-
+ ((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id,true);
SendCastResult(SPELL_FAILED_NO_EDIBLE_CORPSES);
finish(false);
}
diff --git a/src/game/Spell.h b/src/game/Spell.h
index 6dc8477dcdb..642c40de474 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -412,6 +412,8 @@ class Spell
void SetTargetMap(uint32 i, uint32 cur);
+ template<typename T> WorldObject* FindCorpseUsing();
+
bool CheckTarget( Unit* target, uint32 eff );
bool CanAutoCast(Unit* target);
void CheckSrc() { if(!m_targets.HasSrc()) m_targets.setSrc(m_caster); }
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index fa0360eadf1..c950371e517 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -2667,25 +2667,6 @@ void AuraEffect::HandleAuraDummy(bool apply, bool Real)
}
case SPELLFAMILY_HUNTER:
{
- // Improved Aspect of the Viper
- if( GetId()==38390 && m_target->GetTypeId()==TYPEID_PLAYER )
- {
- if(apply)
- {
- // + effect value for Aspect of the Viper
- SpellModifier *mod = new SpellModifier;
- mod->op = SPELLMOD_EFFECT1;
- mod->value = m_amount;
- mod->type = SPELLMOD_FLAT;
- mod->spellId = GetId();
- mod->mask[1] = 0x40000;
-
- m_spellmod = mod;
- }
-
- ((Player*)m_target)->AddSpellMod(m_spellmod, apply);
- return;
- }
// Glyph of Aspect of the Monkey
if(m_spellProto->Id==56833)
{
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 09c596e4979..eeeeb478ca1 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -1312,12 +1312,7 @@ void Spell::EffectDummy(uint32 i)
(GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) &&
spellInfo->Id != 11958 && GetSpellRecoveryTime(spellInfo) > 0 )
{
- ((Player*)m_caster)->RemoveSpellCooldown(classspell);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(classspell);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
+ ((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
}
}
return;
@@ -1568,14 +1563,7 @@ void Spell::EffectDummy(uint32 i)
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags[1] & 0x00000240 || spellInfo->SpellFamilyFlags[0] & 0x00000860))
- {
- ((Player*)m_caster)->RemoveSpellCooldown(classspell);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(classspell);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
+ ((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
}
return;
}
@@ -1602,14 +1590,7 @@ void Spell::EffectDummy(uint32 i)
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != 23989 && GetSpellRecoveryTime(spellInfo) > 0 )
- {
- ((Player*)m_caster)->RemoveSpellCooldown(classspell);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(classspell);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
+ ((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
}
return;
}
@@ -1704,17 +1685,8 @@ void Spell::EffectDummy(uint32 i)
// non-standard cast requirement check
if (!unitTarget || unitTarget->getAttackers().empty())
{
- // clear cooldown at fail
if(m_caster->GetTypeId()==TYPEID_PLAYER)
- {
- ((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(m_spellInfo->Id);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
-
+ ((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id,true);
SendCastResult(SPELL_FAILED_TARGET_AFFECTING_COMBAT);
return;
}
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 6a9f122adf4..3f09eec9351 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -413,7 +413,7 @@ void Unit::resetAttackTimer(WeaponAttackType 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;
@@ -428,7 +428,7 @@ bool Unit::IsWithinCombatRange(Unit *obj, float dist2compare) const
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;
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 5d08cbfa2fb..bb303473e7b 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -940,8 +940,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SetCanDualWield(bool value) { m_canDualWield = value; }
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; }
- bool IsWithinCombatRange(Unit *obj, float dist2compare) const;
- bool IsWithinMeleeRange(Unit *obj, float dist = MELEE_RANGE) const;
+ bool IsWithinCombatRange(const Unit *obj, float dist2compare) 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;
uint32 m_extraAttacks;
bool m_canDualWield;