aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeader <keader.android@gmail.com>2019-10-04 09:33:14 -0300
committerGitHub <noreply@github.com>2019-10-04 09:33:14 -0300
commit8210b4a53976266f12585a2a4f546b33e25343af (patch)
treec8466b78098eada2ecc0c372553d4dba2e23b393 /src
parent34ee2effc89dc5bb34b4873dbfed6081ea8cb685 (diff)
Scripts/ICC: Fixed Death Plague (Frost Giant) (#23847)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp153
2 files changed, 77 insertions, 77 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index ae1ccaaecf0..89f0dfd6c07 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -4235,7 +4235,6 @@ void SpellMgr::LoadSpellInfoCorrections()
70834, // Bone Storm (Lord Marrowgar)
70835, // Bone Storm (Lord Marrowgar)
70836, // Bone Storm (Lord Marrowgar)
- 72864, // Death Plague (Rotting Frost Giant)
71160, // Plague Stench (Stinky)
71161, // Plague Stench (Stinky)
71123 // Decimate (Stinky & Precious)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 9c7dae78feb..833a0f0dd7a 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -422,6 +422,28 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
}
};
+class DeathPlagueTargetSelector
+{
+public:
+ DeathPlagueTargetSelector(Unit* owner) : _me(owner) { }
+
+ bool operator()(Unit* unit) const
+ {
+ if (unit->GetTypeId() != TYPEID_PLAYER || _me->GetDistance(unit) > 100.0f)
+ return false;
+
+ if (_me->GetVictim() && _me->GetVictim()->GetGUID() == unit->GetGUID())
+ return false;
+
+ if (unit->HasAura(SPELL_DEATH_PLAGUE_AURA) || unit->HasAura(SPELL_RECENTLY_INFECTED))
+ return false;
+
+ return true;
+ }
+private:
+ Unit const* _me;
+};
+
class npc_rotting_frost_giant : public CreatureScript
{
public:
@@ -429,9 +451,7 @@ class npc_rotting_frost_giant : public CreatureScript
struct npc_rotting_frost_giantAI : public ScriptedAI
{
- npc_rotting_frost_giantAI(Creature* creature) : ScriptedAI(creature)
- {
- }
+ npc_rotting_frost_giantAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
@@ -444,6 +464,8 @@ class npc_rotting_frost_giant : public CreatureScript
void JustDied(Unit* /*killer*/) override
{
_events.Reset();
+ if (InstanceScript* instance = me->GetInstanceScript())
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DEATH_PLAGUE_AURA);
}
void UpdateAI(uint32 diff) override
@@ -461,10 +483,10 @@ class npc_rotting_frost_giant : public CreatureScript
switch (eventId)
{
case EVENT_DEATH_PLAGUE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, DeathPlagueTargetSelector(me)))
{
Talk(EMOTE_DEATH_PLAGUE_WARNING, target);
- DoCast(target, SPELL_DEATH_PLAGUE);
+ DoCast(target, SPELL_DEATH_PLAGUE_AURA);
}
_events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15s);
break;
@@ -1317,90 +1339,69 @@ class spell_icc_sprit_alarm : public SpellScriptLoader
}
};
-class DeathPlagueTargetSelector
+// 72864 - Death Plague
+class spell_frost_giant_death_plague : public SpellScript
{
- public:
- explicit DeathPlagueTargetSelector(Unit* caster) : _caster(caster) { }
+ PrepareSpellScript(spell_frost_giant_death_plague);
+
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ return ValidateSpellInfo({ SPELL_RECENTLY_INFECTED, SPELL_DEATH_PLAGUE_KILL, SPELL_DEATH_PLAGUE });
+ }
- bool operator()(WorldObject* object) const
+ // Damage Effect count
+ void CountTargets(std::list<WorldObject*>& targets)
+ {
+ _sharedList = targets;
+ _failed = targets.empty();
+ }
+
+ // Filter targets to jump
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets = _sharedList;
+ targets.remove_if([](WorldObject* obj) -> bool
{
- if (object == _caster)
- return true;
+ Unit* object = obj->ToUnit();
- if (object->GetTypeId() != TYPEID_PLAYER)
+ if (!object || object->GetTypeId() != TYPEID_PLAYER)
return true;
- if (object->ToUnit()->HasAura(SPELL_RECENTLY_INFECTED) || object->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA))
+ if (object->HasAura(SPELL_RECENTLY_INFECTED) || object->HasAura(SPELL_DEATH_PLAGUE_AURA))
return true;
return false;
- }
-
- private:
- Unit* _caster;
-};
+ });
+ }
-class spell_frost_giant_death_plague : public SpellScriptLoader
-{
- public:
- spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { }
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ Unit* caster = GetCaster();
+ caster->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE, true);
+ caster->CastSpell(caster, SPELL_RECENTLY_INFECTED, true);
+ }
- class spell_frost_giant_death_plague_SpellScript : public SpellScript
+ void HandleKill()
+ {
+ if (_failed)
{
- PrepareSpellScript(spell_frost_giant_death_plague_SpellScript);
-
- public:
- spell_frost_giant_death_plague_SpellScript()
- {
- _failed = false;
- }
-
- private:
- // First effect
- void CountTargets(std::list<WorldObject*>& targets)
- {
- targets.remove(GetCaster());
- _failed = targets.empty();
- }
-
- // Second effect
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- // Select valid targets for jump
- targets.remove_if(DeathPlagueTargetSelector(GetCaster()));
- if (!targets.empty())
- {
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- }
-
- targets.push_back(GetCaster());
- }
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- if (GetHitUnit() != GetCaster())
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true);
- else if (_failed)
- GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
- OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- }
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, SPELL_DEATH_PLAGUE_KILL, true);
+ }
+ }
- bool _failed;
- };
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
+ OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ AfterCast += SpellCastFn(spell_frost_giant_death_plague::HandleKill);
+ }
- SpellScript* GetSpellScript() const override
- {
- return new spell_frost_giant_death_plague_SpellScript();
- }
+private:
+ bool _failed = false;
+ std::list<WorldObject*> _sharedList;
};
class spell_icc_harvest_blight_specimen : public SpellScriptLoader
@@ -1592,7 +1593,7 @@ void AddSC_icecrown_citadel()
RegisterSpellScript(spell_generic_remove_empowered_blood);
new spell_icc_stoneform();
new spell_icc_sprit_alarm();
- new spell_frost_giant_death_plague();
+ RegisterSpellScript(spell_frost_giant_death_plague);
new spell_icc_harvest_blight_specimen();
new spell_icc_soul_missile();
new at_icc_saurfang_portal();