Merge pull request #4757 from Subv/shocking

Core/Achievements: Fix Shocking! on 10-man and 25-man
This commit is contained in:
Shocker
2012-01-10 15:06:25 -08:00
4 changed files with 81 additions and 36 deletions

View File

@@ -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();
}

View File

@@ -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;
}
};

View File

@@ -49,6 +49,8 @@ enum Data
DATA_HORSEMEN2,
DATA_HORSEMEN3,
DATA_ABOMINATION_KILLED,
DATA_POLARITY_SWITCHED,
};
enum Data64