aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-06-04 16:18:52 -0500
committermegamage <none@none>2009-06-04 16:18:52 -0500
commit797fa43274af9277f7403566dd483f97c98bdcff (patch)
tree282f8773c9217460766108b27ee31bae71eb1798
parent8bb75918a85263493fca49be1993d373f8d2b5fa (diff)
[7952] Implement rogue talent 51690. Author: Lightguard
--HG-- branch : trunk
-rw-r--r--src/game/GridNotifiers.h19
-rw-r--r--src/game/SpellAuras.cpp49
2 files changed, 60 insertions, 8 deletions
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index 25caa970c39..dd82ea2bd78 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -803,6 +803,25 @@ namespace Trinity
float i_range;
};
+ class AnyUnfriendlyVisibleUnitInObjectRangeCheck
+ {
+ public:
+ AnyUnfriendlyVisibleUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range)
+ : i_obj(obj), i_funit(funit), i_range(range) {}
+
+ bool operator()(Unit* u)
+ {
+ return u->isAlive()
+ && i_obj->IsWithinDistInMap(u, i_range)
+ && !i_funit->IsFriendlyTo(u)
+ && u->isVisibleForOrDetect(i_funit, false);
+ }
+ private:
+ WorldObject const* i_obj;
+ Unit const* i_funit;
+ float i_range;
+ };
+
class CreatureWithDbGUIDCheck
{
public:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 46ed4f12c58..d90389bdd0e 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -6628,20 +6628,53 @@ void AuraEffect::PeriodicDummyTick()
{
switch (spell->Id)
{
- // Killing Spree
-// case 51690: break;
- // Overkill
- case 58428:
- if (!m_target->HasAuraType(SPELL_AURA_MOD_STEALTH))
- m_target->RemoveAurasDueToSpell(58427);
- break;
// Master of Subtlety
case 31666:
if (!m_target->HasAuraType(SPELL_AURA_MOD_STEALTH))
m_target->RemoveAurasDueToSpell(31665);
break;
- default:
+ // Killing Spree
+ case 51690:
+ {
+ std::list<Unit*> targets;
+ {
+ // eff_radius ==0
+ float radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(spell->rangeIndex));
+
+ CellPair p(MaNGOS::ComputeCellPair(caster->GetPositionX(),caster->GetPositionY()));
+ Cell cell(p);
+ cell.data.Part.reserved = ALL_DISTRICT;
+
+ MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck u_check(caster, caster, radius);
+ MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck> checker(caster,targets, u_check);
+
+ TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
+ TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
+
+ CellLock<GridReadGuard> cell_lock(cell, p);
+
+ cell_lock->Visit(cell_lock, grid_object_checker, *caster->GetMap());
+ cell_lock->Visit(cell_lock, world_object_checker, *caster->GetMap());
+ }
+
+ if(targets.empty())
+ return;
+
+ std::list<Unit*>::const_iterator itr = targets.begin();
+ std::advance(itr, rand()%targets.size());
+ Unit* target = *itr;
+
+ caster->CastSpell(target, 57840, true);
+ caster->CastSpell(target, 57841, true);
+ return;
+ }
+ // Overkill
+ case 58428:
+ if (!m_target->HasAuraType(SPELL_AURA_MOD_STEALTH))
+ m_target->RemoveAurasDueToSpell(58427);
break;
+// default:
+// break;
}
break;
}