Scripts/Forge of Souls: Revisited Bronjahm script, removed ugly hacks and fixed spells properly
--HG-- branch : trunk
This commit is contained in:
@@ -18156,6 +18156,8 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment
|
||||
( 67623,-67620, 1, 'Remove Paralytic Toxin when hit by Burning Bite'),
|
||||
(-66683, 68667, 0, 'Icehowl - Surge of Adrenaline'),
|
||||
(-67661, 68667, 0, 'Icehowl - Surge of Adrenaline'),
|
||||
-- Forge of Souls
|
||||
(-68839, 68846, 0, 'Bronjahm: Corrupt Soul Summon'),
|
||||
-- Icecrown Citadel
|
||||
(-69674, 69706, 0, 'Rotface: Mutated Infection Summon'),
|
||||
(-71224, 69706, 0, 'Rotface: Mutated Infection Summon'),
|
||||
@@ -26784,6 +26786,13 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||
( 72752, 'spell_pvp_trinket_wotf_shared_cd'),
|
||||
( 72757, 'spell_pvp_trinket_wotf_shared_cd'),
|
||||
-- instances
|
||||
-- Forge of Souls
|
||||
( 68793, 'spell_bronjahm_magic_bane'),
|
||||
( 69050, 'spell_bronjahm_magic_bane'),
|
||||
( 68861, 'spell_bronjahm_consume_soul'),
|
||||
( 69008, 'spell_bronjahm_soulstorm_channel'),
|
||||
( 68870, 'spell_bronjahm_soulstorm_visual'),
|
||||
-- Icecrown Citadel
|
||||
( 69057, 'spell_marrowgar_bone_spike_graveyard'),
|
||||
( 69140, 'spell_marrowgar_coldflame'),
|
||||
( 72705, 'spell_marrowgar_coldflame'),
|
||||
@@ -26861,6 +26870,7 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||
( 72457, 'spell_putricide_regurgitated_ooze'),
|
||||
( 72875, 'spell_putricide_regurgitated_ooze'),
|
||||
( 72876, 'spell_putricide_regurgitated_ooze'),
|
||||
-- Ulduar
|
||||
( 62717, 'spell_ignis_slag_pot'),
|
||||
( 63477, 'spell_ignis_slag_pot'),
|
||||
-- quest
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=-68839;
|
||||
INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES
|
||||
(-68839,68846,0, 'Bronjahm: Corrupt Soul Summon');
|
||||
@@ -0,0 +1,10 @@
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (68793,69050) AND `ScriptName`='spell_bronjahm_magic_bane';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=68861 AND `ScriptName`='spell_bronjahm_consume_soul';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=69008 AND `ScriptName`='spell_bronjahm_soulstorm_channel';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=68870 AND `ScriptName`='spell_bronjahm_soulstorm_visual';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(68793,'spell_bronjahm_magic_bane'),
|
||||
(69050,'spell_bronjahm_magic_bane'),
|
||||
(68861,'spell_bronjahm_consume_soul'),
|
||||
(69008,'spell_bronjahm_soulstorm_channel'),
|
||||
(68870,'spell_bronjahm_soulstorm_visual');
|
||||
@@ -5792,9 +5792,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const * aurApp, uint8 mode, boo
|
||||
if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
|
||||
target->CastSpell(target, 58601, true);
|
||||
break;
|
||||
case 68839: // Corrupt Soul
|
||||
target->CastSpell(target, 68846, true, NULL, this, GetCasterGUID());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_MAGE:
|
||||
|
||||
@@ -1098,7 +1098,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster,
|
||||
if (*itr < 0)
|
||||
target->RemoveAurasDueToSpell(-(*itr));
|
||||
else if (removeMode != AURA_REMOVE_BY_DEFAULT)
|
||||
target->CastSpell(target, *itr, true, 0, 0, GetCasterGUID());
|
||||
target->CastSpell(target, *itr, true, NULL, NULL, GetCasterGUID());
|
||||
}
|
||||
}
|
||||
if (customAttr & SPELL_ATTR_CU_LINK_AURA)
|
||||
|
||||
@@ -2776,7 +2776,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
case 72444:
|
||||
case 72445:
|
||||
case 72446:
|
||||
for (std::list<Unit*>::iterator itr = unitList.begin() ; itr != unitList.end();)
|
||||
for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end();)
|
||||
{
|
||||
if (!(*itr)->HasAura(72293))
|
||||
itr = unitList.erase(itr);
|
||||
@@ -2795,6 +2795,17 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
if (unitList.empty())
|
||||
return;
|
||||
break;
|
||||
case 68921: case 69049: // Soulstorm
|
||||
for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end();)
|
||||
{
|
||||
Position pos;
|
||||
(*itr)->GetPosition(&pos);
|
||||
if (m_caster->GetExactDist2d(&pos) <= 10.0f)
|
||||
itr = unitList.erase(itr);
|
||||
else
|
||||
++itr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Death Pact
|
||||
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00080000)
|
||||
|
||||
@@ -16,190 +16,168 @@
|
||||
*/
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "forge_of_souls.h"
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* - Fix Soul Storm spell and remove work around.
|
||||
*/
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1632001,
|
||||
SAY_SLAY_1 = -1632002,
|
||||
SAY_SLAY_2 = -1632003,
|
||||
SAY_DEATH = -1632004,
|
||||
SAY_SOUL_STORM = -1632005,
|
||||
SAY_CORRUPT_SOUL = -1632006,
|
||||
SAY_AGGRO = -1632001,
|
||||
SAY_SLAY_1 = -1632002,
|
||||
SAY_SLAY_2 = -1632003,
|
||||
SAY_DEATH = -1632004,
|
||||
SAY_SOUL_STORM = -1632005,
|
||||
SAY_CORRUPT_SOUL = -1632006,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_MAGIC_S_BANE = 68793,
|
||||
SPELL_CORRUPT_SOUL = 68839,
|
||||
SPELL_CONSUME_SOUL = 68858,
|
||||
SPELL_TELEPORT = 68988,
|
||||
SPELL_FEAR = 68950,
|
||||
SPELL_SOULSTORM = 68872,
|
||||
SPELL_SOULSTORM_AURA = 68921,
|
||||
SPELL_SHADOW_BOLT = 70043,
|
||||
SPELL_MAGIC_S_BANE = 68793,
|
||||
SPELL_SHADOW_BOLT = 70043,
|
||||
SPELL_CORRUPT_SOUL = 68839,
|
||||
SPELL_CONSUME_SOUL = 68861,
|
||||
SPELL_TELEPORT = 68988,
|
||||
SPELL_FEAR = 68950,
|
||||
SPELL_SOULSTORM = 68872,
|
||||
SPELL_SOULSTORM_CHANNEL = 69008, // pre-fight
|
||||
SPELL_SOULSTORM_VISUAL = 68870, // pre-cast soulstorm
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_SHADOW_BOLT,
|
||||
EVENT_MAGIC_BANE,
|
||||
EVENT_CORRUPT_SOUL,
|
||||
EVENT_SOUL_STORM,
|
||||
EVENT_SOUL_STORM_AURA,
|
||||
EVENT_FEAR,
|
||||
EVENT_MAGIC_BANE = 1,
|
||||
EVENT_SHADOW_BOLT = 2,
|
||||
EVENT_CORRUPT_SOUL = 3,
|
||||
EVENT_SOULSTORM = 4,
|
||||
EVENT_FEAR = 5,
|
||||
};
|
||||
|
||||
enum CombatPhases
|
||||
{
|
||||
PHASE_1,
|
||||
PHASE_2
|
||||
PHASE_1 = 1,
|
||||
PHASE_2 = 2
|
||||
};
|
||||
|
||||
class boss_bronjahm : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_bronjahm() : CreatureScript("boss_bronjahm") { }
|
||||
public:
|
||||
boss_bronjahm() : CreatureScript("boss_bronjahm") { }
|
||||
|
||||
struct boss_bronjahmAI : public ScriptedAI
|
||||
{
|
||||
boss_bronjahmAI(Creature *c) : ScriptedAI(c)
|
||||
struct boss_bronjahmAI : public BossAI
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
CombatPhases phase;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
phase = PHASE_1;
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000));
|
||||
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000));
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_BRONJAHM_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_BRONJAHM_EVENT, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_BRONJAHM_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
// Cast aura spell on all players farther than 10y
|
||||
void ApplySoulStorm()
|
||||
{
|
||||
std::list<Unit*> targetList;
|
||||
|
||||
SelectTargetList(targetList, 100, SELECT_TARGET_TOPAGGRO, -10.0f);
|
||||
if (targetList.empty())
|
||||
return;
|
||||
|
||||
for (std::list<Unit *>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
|
||||
boss_bronjahmAI(Creature* pCreature) : BossAI(pCreature, DATA_BRONJAHM)
|
||||
{
|
||||
Unit* pUnit = (*itr);
|
||||
if (pUnit && pUnit->isAlive())
|
||||
me->CastSpell(pUnit, SPELL_SOULSTORM_AURA, true);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
if (phase == PHASE_1 && HealthBelowPct(30))
|
||||
{
|
||||
phase = PHASE_2;
|
||||
DoCast(me,SPELL_TELEPORT);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
events.CancelEvent(EVENT_CORRUPT_SOUL);
|
||||
events.CancelEvent(EVENT_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SOUL_STORM, 1000);
|
||||
events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
|
||||
return;
|
||||
// disable AI outside of instance
|
||||
if (!instance)
|
||||
me->IsAIEnabled = false;
|
||||
}
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
void Reset()
|
||||
{
|
||||
switch(eventId)
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_1);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000, 15000));
|
||||
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000, 35000), 0, PHASE_1);
|
||||
|
||||
me->CastSpell(me, SPELL_SOULSTORM_CHANNEL, true);
|
||||
|
||||
instance->SetBossState(DATA_BRONJAHM, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL);
|
||||
|
||||
instance->SetBossState(DATA_BRONJAHM, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
|
||||
instance->SetBossState(DATA_BRONJAHM, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit * who)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage)
|
||||
{
|
||||
if (events.GetPhaseMask() & (1 << PHASE_1) && !HealthAbovePct(30))
|
||||
{
|
||||
case EVENT_CORRUPT_SOUL:
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
|
||||
{
|
||||
DoScriptText(SAY_CORRUPT_SOUL, me);
|
||||
DoCast(pTarget,SPELL_CORRUPT_SOUL);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000));
|
||||
break;
|
||||
case EVENT_SOUL_STORM:
|
||||
DoScriptText(SAY_SOUL_STORM, me);
|
||||
events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
|
||||
break;
|
||||
case EVENT_SOUL_STORM_AURA:
|
||||
ApplySoulStorm();
|
||||
events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
|
||||
break;
|
||||
case EVENT_FEAR:
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
|
||||
DoCast(pTarget,SPELL_FEAR);
|
||||
events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
if (!me->IsWithinMeleeRange(me->getVictim()))
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
break;
|
||||
case EVENT_MAGIC_BANE:
|
||||
DoCastVictim(SPELL_MAGIC_S_BANE);
|
||||
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000));
|
||||
break;
|
||||
events.SetPhase(PHASE_2);
|
||||
DoCast(me, SPELL_TELEPORT);
|
||||
events.ScheduleEvent(EVENT_FEAR, urand(12000, 16000), 0, PHASE_2);
|
||||
events.ScheduleEvent(EVENT_SOULSTORM, 700, 0, PHASE_2);
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->GetMotionMaster()->Clear();
|
||||
summon->GetMotionMaster()->MoveFollow(me, me->GetObjectSize(), 0.0f);
|
||||
}
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
{
|
||||
return new boss_bronjahmAI(creature);
|
||||
}
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_MAGIC_BANE:
|
||||
DoCastVictim(SPELL_MAGIC_S_BANE);
|
||||
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000, 15000));
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
if (!me->IsWithinMeleeRange(me->getVictim()))
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
break;
|
||||
case EVENT_CORRUPT_SOUL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
{
|
||||
DoScriptText(SAY_CORRUPT_SOUL, me);
|
||||
DoCast(target, SPELL_CORRUPT_SOUL);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000, 35000), 0, PHASE_1);
|
||||
break;
|
||||
case EVENT_SOULSTORM:
|
||||
DoScriptText(SAY_SOUL_STORM, me);
|
||||
me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
|
||||
me->CastSpell(me, SPELL_SOULSTORM, false);
|
||||
break;
|
||||
case EVENT_FEAR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
|
||||
events.ScheduleEvent(EVENT_FEAR, urand(8000, 12000), 0, PHASE_2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_bronjahmAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class mob_corrupted_soul_fragment : public CreatureScript
|
||||
@@ -209,60 +187,170 @@ public:
|
||||
|
||||
struct mob_corrupted_soul_fragmentAI : public ScriptedAI
|
||||
{
|
||||
mob_corrupted_soul_fragmentAI(Creature *c) : ScriptedAI(c)
|
||||
mob_corrupted_soul_fragmentAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
instance = me->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
|
||||
uint32 uiCheckTimer;
|
||||
|
||||
void Reset()
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
uiCheckTimer = 0; // first check is immediate
|
||||
}
|
||||
if (type != TARGETED_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (uiCheckTimer <= diff)
|
||||
uint64 BronjahmGUID = 0;
|
||||
if (instance)
|
||||
{
|
||||
if (pInstance)
|
||||
if (TempSummon* summ = me->ToTempSummon())
|
||||
{
|
||||
Creature* pBronjham = Unit::GetCreature(*me, pInstance->GetData64(DATA_BRONJAHM));
|
||||
if (pBronjham && pBronjham->isAlive())
|
||||
{
|
||||
if (me->IsWithinMeleeRange(pBronjham))
|
||||
{
|
||||
pBronjham->CastSpell(pBronjham, SPELL_CONSUME_SOUL, true);
|
||||
me->ForcedDespawn();
|
||||
}
|
||||
else
|
||||
{
|
||||
Position pos;
|
||||
pBronjham->GetPosition(&pos);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MovePoint(0, pos);
|
||||
}
|
||||
}
|
||||
else
|
||||
me->ForcedDespawn();
|
||||
BronjahmGUID = instance->GetData64(DATA_BRONJAHM);
|
||||
if (GUID_LOPART(BronjahmGUID) != id)
|
||||
return;
|
||||
|
||||
if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID))
|
||||
me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true);
|
||||
|
||||
summ->GetMotionMaster()->MoveIdle();
|
||||
summ->UnSummon();
|
||||
}
|
||||
uiCheckTimer = 500;
|
||||
}
|
||||
else
|
||||
uiCheckTimer -= diff;
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
CreatureAI *GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_corrupted_soul_fragmentAI(creature);
|
||||
return new mob_corrupted_soul_fragmentAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_bronjahm_magic_bane : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { }
|
||||
|
||||
class spell_bronjahm_magic_bane_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript);
|
||||
|
||||
void RecalculateDamage()
|
||||
{
|
||||
if (GetHitUnit()->getPowerType() != POWER_MANA)
|
||||
return;
|
||||
|
||||
const int32 maxDamage = GetCaster()->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000;
|
||||
int32 newDamage = GetHitDamage();
|
||||
newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2;
|
||||
newDamage = std::min<int32>(maxDamage, newDamage);
|
||||
|
||||
SetHitDamage(newDamage);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_bronjahm_magic_bane_SpellScript::RecalculateDamage);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_bronjahm_magic_bane_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_bronjahm_consume_soul : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_bronjahm_consume_soul() : SpellScriptLoader("spell_bronjahm_consume_soul") { }
|
||||
|
||||
class spell_bronjahm_consume_soul_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_bronjahm_consume_soul_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffect += SpellEffectFn(spell_bronjahm_consume_soul_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_bronjahm_consume_soul_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_bronjahm_soulstorm_channel : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_bronjahm_soulstorm_channel() : SpellScriptLoader("spell_bronjahm_soulstorm_channel") { }
|
||||
|
||||
class spell_bronjahm_soulstorm_channel_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_bronjahm_soulstorm_channel_AuraScript);
|
||||
|
||||
void HandlePeriodicTick(AuraEffect const* /*aurEff*/, AuraApplication const* aurApp)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
for (uint32 i = 68904; i <= 68907; ++i)
|
||||
aurApp->GetTarget()->CastSpell(aurApp->GetTarget(), i, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_bronjahm_soulstorm_channel_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_bronjahm_soulstorm_visual() : SpellScriptLoader("spell_bronjahm_soulstorm_visual") { }
|
||||
|
||||
class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_bronjahm_soulstorm_visual_AuraScript);
|
||||
|
||||
void HandlePeriodicTick(AuraEffect const* aurEff, AuraApplication const* aurApp)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (aurEff->GetTickNumber()%5)
|
||||
return;
|
||||
aurApp->GetTarget()->CastSpell(aurApp->GetTarget(), 68886, true);
|
||||
for (uint32 i = 68896; i <= 68898; ++i)
|
||||
aurApp->GetTarget()->CastSpell(aurApp->GetTarget(), i, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_bronjahm_soulstorm_visual_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_bronjahm()
|
||||
{
|
||||
new boss_bronjahm;
|
||||
new mob_corrupted_soul_fragment;
|
||||
new boss_bronjahm();
|
||||
new mob_corrupted_soul_fragment();
|
||||
new spell_bronjahm_magic_bane();
|
||||
new spell_bronjahm_consume_soul();
|
||||
new spell_bronjahm_soulstorm_channel();
|
||||
new spell_bronjahm_soulstorm_visual();
|
||||
}
|
||||
|
||||
@@ -122,9 +122,9 @@ class boss_devourer_of_souls : public CreatureScript
|
||||
public:
|
||||
boss_devourer_of_souls() : CreatureScript("boss_devourer_of_souls") { }
|
||||
|
||||
struct boss_devourer_of_soulsAI : public ScriptedAI
|
||||
struct boss_devourer_of_soulsAI : public BossAI
|
||||
{
|
||||
boss_devourer_of_soulsAI(Creature *c) : ScriptedAI(c)
|
||||
boss_devourer_of_soulsAI(Creature *c) : BossAI(c, DATA_DEVOURER_EVENT)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
@@ -132,7 +132,6 @@ public:
|
||||
bool bThreeFaceAchievement;
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
// wailing soul event
|
||||
float beamAngle;
|
||||
|
||||
@@ -20,9 +20,8 @@
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_BRONJAHM_EVENT,
|
||||
DATA_DEVOURER_EVENT,
|
||||
DATA_TEAM_IN_INSTANCE,
|
||||
DATA_DEVOURER_EVENT = 1,
|
||||
DATA_TEAM_IN_INSTANCE = 2,
|
||||
};
|
||||
|
||||
enum Data64
|
||||
|
||||
+90
-117
@@ -27,145 +27,118 @@
|
||||
|
||||
class instance_forge_of_souls : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_forge_of_souls() : InstanceMapScript("instance_forge_of_souls", 632) { }
|
||||
public:
|
||||
instance_forge_of_souls() : InstanceMapScript("instance_forge_of_souls", 632) { }
|
||||
|
||||
struct instance_forge_of_souls_InstanceScript : public InstanceScript
|
||||
{
|
||||
instance_forge_of_souls_InstanceScript(Map* pMap) : InstanceScript(pMap) {};
|
||||
|
||||
uint64 uiBronjahm;
|
||||
uint64 uiDevourer;
|
||||
|
||||
uint32 uiEncounter[MAX_ENCOUNTER];
|
||||
uint32 uiTeamInInstance;
|
||||
|
||||
void Initialize()
|
||||
struct instance_forge_of_souls_InstanceScript : public InstanceScript
|
||||
{
|
||||
uiBronjahm = 0;
|
||||
uiDevourer = 0;
|
||||
|
||||
uiTeamInInstance = 0;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
uiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (uiEncounter[i] == IN_PROGRESS) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
|
||||
{
|
||||
Map::PlayerList const &players = instance->GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
if (Player* pPlayer = players.begin()->getSource())
|
||||
uiTeamInInstance = pPlayer->GetTeamId();
|
||||
|
||||
switch(pCreature->GetEntry())
|
||||
instance_forge_of_souls_InstanceScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
case CREATURE_BRONJAHM:
|
||||
uiBronjahm = pCreature->GetGUID();
|
||||
break;
|
||||
case CREATURE_DEVOURER:
|
||||
uiDevourer = pCreature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
uiBronjahm = 0;
|
||||
uiDevourer = 0;
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_BRONJAHM_EVENT:
|
||||
uiEncounter[0] = data;
|
||||
break;
|
||||
case DATA_DEVOURER_EVENT:
|
||||
uiEncounter[1] = data;
|
||||
break;
|
||||
uiTeamInInstance = 0;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch(type)
|
||||
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
|
||||
{
|
||||
case DATA_BRONJAHM_EVENT: return uiEncounter[0];
|
||||
case DATA_DEVOURER_EVENT: return uiEncounter[1];
|
||||
case DATA_TEAM_IN_INSTANCE: return uiTeamInInstance;
|
||||
Map::PlayerList const &players = instance->GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
if (Player* pPlayer = players.begin()->getSource())
|
||||
uiTeamInInstance = pPlayer->GetTeamId();
|
||||
|
||||
switch(pCreature->GetEntry())
|
||||
{
|
||||
case CREATURE_BRONJAHM:
|
||||
uiBronjahm = pCreature->GetGUID();
|
||||
break;
|
||||
case CREATURE_DEVOURER:
|
||||
uiDevourer = pCreature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier)
|
||||
{
|
||||
switch(identifier)
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
case DATA_BRONJAHM: return uiBronjahm;
|
||||
case DATA_DEVOURER: return uiBronjahm;
|
||||
switch(type)
|
||||
{
|
||||
case DATA_TEAM_IN_INSTANCE:
|
||||
return uiTeamInInstance;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "F S " << uiEncounter[0] << " " << uiEncounter[1];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
uint64 GetData64(uint32 identifier)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
switch(identifier)
|
||||
{
|
||||
case DATA_BRONJAHM: return uiBronjahm;
|
||||
case DATA_DEVOURER: return uiBronjahm;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
uint16 data0, data1;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
|
||||
|
||||
if (dataHead1 == 'F' && dataHead2 == 'S')
|
||||
std::string GetSaveData()
|
||||
{
|
||||
uiEncounter[0] = data0;
|
||||
uiEncounter[1] = data1;
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (uiEncounter[i] == IN_PROGRESS)
|
||||
uiEncounter[i] = NOT_STARTED;
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "F S " << GetBossSaveData();
|
||||
|
||||
} else OUT_LOAD_INST_DATA_FAIL;
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'F' && dataHead2 == 'S')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
} else OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 uiBronjahm;
|
||||
uint64 uiDevourer;
|
||||
|
||||
uint32 uiTeamInInstance;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap *map) const
|
||||
{
|
||||
return new instance_forge_of_souls_InstanceScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap *map) const
|
||||
{
|
||||
return new instance_forge_of_souls_InstanceScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_forge_of_souls()
|
||||
{
|
||||
new instance_forge_of_souls;
|
||||
new instance_forge_of_souls();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user