aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp32
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp59
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp24
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h2
4 files changed, 81 insertions, 36 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 40b3101cfd5..2c33488f76c 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -333,38 +333,6 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
switch (m_spellInfo->Id) // better way to check unknown
{
- // Positive/Negative Charge
- case 28062:
- case 28085:
- case 39090:
- case 39093:
- if (!m_triggeredByAuraSpell)
- break;
- if (unitTarget == m_caster)
- {
- uint8 count = 0;
- for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
- if (ihit->targetGUID != m_caster->GetGUID())
- if (Player* target = ObjectAccessor::GetPlayer(*m_caster, ihit->targetGUID))
- if (target->HasAura(m_triggeredByAuraSpell->Id))
- ++count;
- if (count)
- {
- uint32 spellId = 0;
- switch (m_spellInfo->Id)
- {
- case 28062: spellId = 29659; break;
- case 28085: spellId = 29660; break;
- case 39090: spellId = 39089; break;
- case 39093: spellId = 39092; break;
- }
- m_caster->SetAuraStack(spellId, m_caster, count);
- }
- }
-
- if (unitTarget->HasAura(m_triggeredByAuraSpell->Id))
- damage = 0;
- break;
// Consumption
case 28865:
damage = (((InstanceMap*)m_caster->GetMap())->GetDifficulty() == REGULAR_DIFFICULTY ? 2750 : 4250);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index b0138fb1a5e..24ef5fdcd3e 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -400,9 +400,68 @@ public:
};
+class spell_thaddius_pos_neg_charge : public SpellScriptLoader
+{
+ public:
+ spell_thaddius_pos_neg_charge() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { }
+
+ class spell_thaddius_pos_neg_charge_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_thaddius_pos_neg_charge_SpellScript);
+
+ void HandleTargets(std::list<Unit*>& targetList)
+ {
+ uint8 count = 0;
+ for (std::list<Unit*>::iterator ihit = targetList.begin(); ihit != targetList.end(); ++ihit)
+ if ((*ihit)->GetGUID() != GetCaster()->GetGUID())
+ if (Player* target = (*ihit)->ToPlayer())
+ if (target->HasAura(GetTriggeringSpell()->Id))
+ ++count;
+ if (count)
+ {
+ uint32 spellId = 0;
+ switch (GetSpellInfo()->Id)
+ {
+ case 28062: spellId = 29659; break;
+ case 28085: spellId = 29660; break;
+ case 39090: spellId = 39089; break;
+ case 39093: spellId = 39092; break;
+ }
+ GetCaster()->SetAuraStack(spellId, GetCaster(), count);
+ }
+ }
+
+ void HandleDamage(SpellEffIndex /*effIndex*/)
+ {
+ if (!GetTriggeringSpell())
+ return;
+
+ Unit* target = GetHitUnit();
+
+ if (target->HasAura(GetTriggeringSpell()->Id))
+ SetHitDamage(0);
+ else
+ if (InstanceScript* instance = target->GetInstanceScript())
+ instance->SetData(DATA_POLARITY_SWITCHED, 1);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_thaddius_pos_neg_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_thaddius_pos_neg_charge_SpellScript();
+ }
+};
+
void AddSC_boss_thaddius()
{
new boss_thaddius();
new mob_stalagg();
new mob_feugen();
+ new spell_thaddius_pos_neg_charge();
}
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 32cb279ce5f..9ae6f8d9776 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -148,6 +148,8 @@ public:
time_t maxHorsemenDiedTime;
uint32 playerDied;
+
+ uint32 PolaritySwitch;
void Initialize()
{
@@ -166,8 +168,10 @@ public:
kelthuzadGUID = 0;
kelthuzadTriggerGUID = 0;
- playerDied = 0;
- gothikDoorState = GO_STATE_ACTIVE;
+ playerDied = 0;
+ gothikDoorState = GO_STATE_ACTIVE;
+
+ PolaritySwitch = 0;
memset(portalsGUID, 0, sizeof(portalsGUID));
}
@@ -311,6 +315,9 @@ public:
case DATA_ABOMINATION_KILLED:
AbominationCount = value;
break;
+ case DATA_POLARITY_SWITCHED:
+ PolaritySwitch = value;
+ break;
}
}
@@ -440,6 +447,13 @@ public:
if (AreAllEncoutersDone() && !playerDied)
return true;
return false;
+ // Criteria for achievement 2178: Shocking! (10-man)
+ case 7604:
+ // Criteria for achievement 2179: Shocking! (25-man)
+ case 7605:
+ if (!PolaritySwitch)
+ return true;
+ return false;
}
return false;
}
@@ -447,14 +461,14 @@ public:
std::string GetSaveData()
{
std::ostringstream saveStream;
- saveStream << GetBossSaveData() << gothikDoorState << ' ' << playerDied;
+ saveStream << GetBossSaveData() << gothikDoorState << ' ' << playerDied << ' ' << PolaritySwitch;
return saveStream.str();
}
void Load(const char * data)
{
std::istringstream loadStream(LoadBossState(data));
- uint32 temp, buff, buff2;
+ uint32 temp, buff, buff2, buff3;
for (uint32 i = 0; i < MAX_BOSS_NUMBER; ++i)
loadStream >> temp;
@@ -463,6 +477,8 @@ public:
gothikDoorState = GOState(buff);
loadStream >> buff2;
playerDied = buff2;
+ loadStream >> buff3;
+ PolaritySwitch = buff3;
}
};
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index 43393aff844..34d465c775d 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -49,6 +49,8 @@ enum Data
DATA_HORSEMEN2,
DATA_HORSEMEN3,
DATA_ABOMINATION_KILLED,
+
+ DATA_POLARITY_SWITCHED,
};
enum Data64