diff options
author | megamage <none@none> | 2009-06-04 16:18:52 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-06-04 16:18:52 -0500 |
commit | 797fa43274af9277f7403566dd483f97c98bdcff (patch) | |
tree | 282f8773c9217460766108b27ee31bae71eb1798 | |
parent | 8bb75918a85263493fca49be1993d373f8d2b5fa (diff) |
[7952] Implement rogue talent 51690. Author: Lightguard
--HG--
branch : trunk
-rw-r--r-- | src/game/GridNotifiers.h | 19 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 49 |
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; } |