Fix crash in boss_svala script + some cleanup.
Fixes issue #880. --HG-- branch : trunk
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user