Core/Spells: move killing spree to spellscript
Closes #10597 Closes #11468
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=51690;
|
||||
INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES
|
||||
(51690, 'spell_rog_killing_spree');
|
||||
@@ -835,26 +835,6 @@ namespace Trinity
|
||||
float i_range;
|
||||
};
|
||||
|
||||
class AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck
|
||||
{
|
||||
public:
|
||||
AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck(Unit const* funit, float range)
|
||||
: i_funit(funit), i_range(range) { }
|
||||
|
||||
bool operator()(const Unit* u)
|
||||
{
|
||||
return u->IsAlive()
|
||||
&& i_funit->IsWithinDistInMap(u, i_range)
|
||||
&& !i_funit->IsFriendlyTo(u)
|
||||
&& i_funit->IsValidAttackTarget(u)
|
||||
&& u->GetCreatureType() != CREATURE_TYPE_CRITTER
|
||||
&& i_funit->CanSeeOrDetect(u);
|
||||
}
|
||||
private:
|
||||
Unit const* i_funit;
|
||||
float i_range;
|
||||
};
|
||||
|
||||
class CreatureWithDbGUIDCheck
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "Formulas.h"
|
||||
#include "GridNotifiers.h"
|
||||
#include "GridNotifiersImpl.h"
|
||||
#include "CellImpl.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "Vehicle.h"
|
||||
#include "Battlefield.h"
|
||||
@@ -5351,37 +5350,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const
|
||||
if (!target->HasAuraType(SPELL_AURA_MOD_STEALTH))
|
||||
target->RemoveAurasDueToSpell(31665);
|
||||
break;
|
||||
// Killing Spree
|
||||
case 51690:
|
||||
{
|
||||
/// @todo this should use effect[1] of 51690
|
||||
UnitList targets;
|
||||
{
|
||||
// eff_radius == 0
|
||||
float radius = GetSpellInfo()->GetMaxRange(false);
|
||||
|
||||
CellCoord p(Trinity::ComputeCellCoord(target->GetPositionX(), target->GetPositionY()));
|
||||
Cell cell(p);
|
||||
|
||||
Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck u_check(target, radius);
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck> checker(target, targets, u_check);
|
||||
|
||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
|
||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
|
||||
|
||||
cell.Visit(p, grid_object_checker, *GetBase()->GetOwner()->GetMap(), *target, radius);
|
||||
cell.Visit(p, world_object_checker, *GetBase()->GetOwner()->GetMap(), *target, radius);
|
||||
}
|
||||
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
Unit* spellTarget = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
|
||||
target->CastSpell(spellTarget, 57840, true);
|
||||
target->CastSpell(spellTarget, 57841, true);
|
||||
break;
|
||||
}
|
||||
// Overkill
|
||||
case 58428:
|
||||
if (!target->HasAuraType(SPELL_AURA_MOD_STEALTH))
|
||||
|
||||
@@ -28,13 +28,17 @@
|
||||
|
||||
enum RogueSpells
|
||||
{
|
||||
SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
|
||||
SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231,
|
||||
SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819,
|
||||
SPELL_ROGUE_PREY_ON_THE_WEAK = 58670,
|
||||
SPELL_ROGUE_SHIV_TRIGGERED = 5940,
|
||||
SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933,
|
||||
SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
|
||||
SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
|
||||
SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231,
|
||||
SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819,
|
||||
SPELL_ROGUE_KILLING_SPREE = 51690,
|
||||
SPELL_ROGUE_KILLING_SPREE_TELEPORT = 57840,
|
||||
SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG = 57841,
|
||||
SPELL_ROGUE_KILLING_SPREE_DMG_BUFF = 61851,
|
||||
SPELL_ROGUE_PREY_ON_THE_WEAK = 58670,
|
||||
SPELL_ROGUE_SHIV_TRIGGERED = 5940,
|
||||
SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933,
|
||||
SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
|
||||
};
|
||||
|
||||
// 13877, 33735, (check 51211, 65956) - Blade Flurry
|
||||
@@ -249,6 +253,105 @@ class spell_rog_deadly_poison : public SpellScriptLoader
|
||||
}
|
||||
};
|
||||
|
||||
// 51690 - Killing Spree
|
||||
class spell_rog_killing_spree : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_rog_killing_spree() : SpellScriptLoader("spell_rog_killing_spree") { }
|
||||
|
||||
class spell_rog_killing_spree_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_rog_killing_spree_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
if (targets.empty() || GetCaster()->GetVehicleBase())
|
||||
FinishCast(SPELL_FAILED_OUT_OF_RANGE);
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE))
|
||||
{
|
||||
if (spell_rog_killing_spree_AuraScript* script = dynamic_cast<spell_rog_killing_spree_AuraScript*>(aura->GetScriptByName("spell_rog_killing_spree")))
|
||||
script->AddTarget(GetHitUnit());
|
||||
}
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_killing_spree_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_rog_killing_spree_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const OVERRIDE
|
||||
{
|
||||
return new spell_rog_killing_spree_SpellScript();
|
||||
}
|
||||
|
||||
class spell_rog_killing_spree_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_rog_killing_spree_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_TELEPORT)
|
||||
|| !sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG)
|
||||
|| !sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_ROGUE_KILLING_SPREE_DMG_BUFF, true);
|
||||
}
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
while (!_targets.empty())
|
||||
{
|
||||
uint64 guid = Trinity::Containers::SelectRandomContainerElement(_targets);
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), guid))
|
||||
{
|
||||
GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true);
|
||||
GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, true);
|
||||
break;
|
||||
}
|
||||
else
|
||||
_targets.remove(guid);
|
||||
}
|
||||
}
|
||||
|
||||
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->RemoveAurasDueToSpell(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF);
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_rog_killing_spree_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_killing_spree_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_rog_killing_spree_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
|
||||
public:
|
||||
void AddTarget(Unit* target)
|
||||
{
|
||||
_targets.push_back(target->GetGUID());
|
||||
}
|
||||
|
||||
private:
|
||||
std::list<uint64> _targets;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const OVERRIDE
|
||||
{
|
||||
return new spell_rog_killing_spree_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
// -31130 - Nerves of Steel
|
||||
class spell_rog_nerves_of_steel : public SpellScriptLoader
|
||||
{
|
||||
@@ -594,6 +697,7 @@ void AddSC_rogue_spell_scripts()
|
||||
new spell_rog_blade_flurry();
|
||||
new spell_rog_cheat_death();
|
||||
new spell_rog_deadly_poison();
|
||||
new spell_rog_killing_spree();
|
||||
new spell_rog_nerves_of_steel();
|
||||
new spell_rog_preparation();
|
||||
new spell_rog_prey_on_the_weak();
|
||||
|
||||
Reference in New Issue
Block a user