Fix crash in boss_svala script + some cleanup.

Fixes issue #880.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-03-13 11:48:43 +01:00
parent eb96718b5f
commit 4c9a9a02b0
@@ -68,11 +68,7 @@ enum CombatPhase
NORMAL, NORMAL,
SACRIFICING SACRIFICING
}; };
struct Locations static Position RitualChannelerPos[]=
{
float x, y, z;
};
static Locations RitualChannelerLocations[]=
{ {
{296.42, -355.01, 90.94}, {296.42, -355.01, 90.94},
{302.36, -352.01, 90.54}, {302.36, -352.01, 90.54},
@@ -92,7 +88,7 @@ struct boss_svalaAI : public ScriptedAI
IntroPhase Phase; IntroPhase Phase;
Creature* pArthas; TempSummon* pArthas;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -111,12 +107,13 @@ struct boss_svalaAI : public ScriptedAI
{ {
if (!pWho) if (!pWho)
return; return;
if (Phase == IDLE && pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && Phase == IDLE && m_creature->IsWithinDistInMap(pWho, 40))
if (Phase == IDLE && pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && m_creature->IsWithinDistInMap(pWho, 40))
{ {
Phase = INTRO; Phase = INTRO;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000)) if (pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN))
{ {
pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5); pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5);
@@ -133,7 +130,7 @@ struct boss_svalaAI : public ScriptedAI
if (uiIntroTimer <= diff) if (uiIntroTimer <= diff)
{ {
if(!pArthas) if (!pArthas)
return; return;
switch (uiIntroPhase) switch (uiIntroPhase)
@@ -174,11 +171,13 @@ struct boss_svalaAI : public ScriptedAI
{ {
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID); m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID);
pArthas->DisappearAndDie(); pArthas->UnSummon();
pArthas = NULL;
Phase = FINISHED; Phase = FINISHED;
} }
else Reset(); else
return; Reset();
break;
} }
} else uiIntroTimer -= diff; } else uiIntroTimer -= diff;
} }
@@ -198,17 +197,21 @@ struct mob_ritual_channelerAI : public Scripted_NoMovementAI
DoCast(m_creature, SPELL_SHADOWS_IN_THE_DARK); DoCast(m_creature, SPELL_SHADOWS_IN_THE_DARK);
} }
// called by svala sorrowgrave to set guid of victim
void SetGUID(const uint64 &guid, int32 id)
{
if (Unit *pVictim = m_creature->GetUnit(*m_creature, guid))
DoCast(pVictim, SPELL_PARALYZE);
}
void EnterCombat(Unit* who) void EnterCombat(Unit* who)
{ {
if (who && !who->HasAura(SPELL_PARALYZE,0))
DoCast(who, SPELL_PARALYZE);
return;
} }
}; };
struct boss_svala_sorrowgraveAI : public ScriptedAI struct boss_svala_sorrowgraveAI : public ScriptedAI
{ {
boss_svala_sorrowgraveAI(Creature *c) : ScriptedAI(c) boss_svala_sorrowgraveAI(Creature *c) : ScriptedAI(c), summons(c)
{ {
pInstance = c->GetInstanceData(); pInstance = c->GetInstanceData();
} }
@@ -220,7 +223,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
CombatPhase Phase; CombatPhase Phase;
Creature* pRitualChanneler[3]; SummonList summons;
Unit* pSacrificeTarget; Unit* pSacrificeTarget;
bool bSacrificed; bool bSacrificed;
@@ -241,8 +244,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
DoTeleportTo(296.632, -346.075, 90.6307); DoTeleportTo(296.632, -346.075, 90.6307);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
for (uint8 i = 0; i < 3; ++i) summons.DespawnAll();
pRitualChanneler[i] = NULL;
pSacrificeTarget = NULL; pSacrificeTarget = NULL;
if (pInstance) if (pInstance)
@@ -257,6 +259,16 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS); pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS);
} }
void JustSummoned(Creature *summon)
{
summons.Summon(summon);
}
void SummonedCreatureDespawn(Creature *summon)
{
summons.Despawn(summon);
}
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
if (Phase == NORMAL) if (Phase == NORMAL)
@@ -280,7 +292,8 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
} }
} else uiCallFlamesTimer -= diff; } else uiCallFlamesTimer -= diff;
if (!bSacrificed && uiRitualOfSwordTimer <= diff) if (!bSacrificed)
if (uiRitualOfSwordTimer <= diff)
{ {
pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (pSacrificeTarget) if (pSacrificeTarget)
@@ -294,9 +307,9 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
Phase = SACRIFICING; Phase = SACRIFICING;
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
if (pRitualChanneler[i] = m_creature->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerLocations[i].x, RitualChannelerLocations[i].y, RitualChannelerLocations[i].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) if (Creature* pRitualChanneler = m_creature->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerPos[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
if (mob_ritual_channelerAI *pChannelerAI = CAST_AI(mob_ritual_channelerAI,pRitualChanneler[i]->AI())) if (pRitualChanneler->AI())
pChannelerAI->AttackStartNoMove(pSacrificeTarget); pRitualChanneler->AI()->SetGUID(pSacrificeTarget->GetGUID());
bSacrificed = true; bSacrificed = true;
} }
@@ -308,16 +321,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
{ {
if (uiSacrificeTimer <= diff) if (uiSacrificeTimer <= diff)
{ {
bool bSacrificed = false; if (!summons.empty() && pSacrificeTarget && pSacrificeTarget->isAlive())
for (uint8 i = 0; i < 3; ++i)
{
if (pRitualChanneler[i] && pRitualChanneler[i]->isAlive())
{
bSacrificed = true;
break;
}
}
if (bSacrificed && pSacrificeTarget && pSacrificeTarget->isAlive())
m_creature->Kill(pSacrificeTarget, false); // durability damage? m_creature->Kill(pSacrificeTarget, false); // durability damage?
//go down //go down
@@ -346,7 +350,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
if (pSvala && pSvala->isAlive()) if (pSvala && pSvala->isAlive())
pKiller->Kill(pSvala); pKiller->Kill(pSvala);
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS); pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, DONE);
} }
DoScriptText(SAY_DEATH, m_creature); DoScriptText(SAY_DEATH, m_creature);
} }