Fix crash in Prince Taldaram script.

Fixes issue #884.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-02-28 12:02:13 +01:00
parent 6e52fc3f7f
commit eeae1f4571
@@ -96,12 +96,7 @@ struct boss_taldaramAI : public ScriptedAI
uint32 uiFlamesphereTimer; uint32 uiFlamesphereTimer;
uint32 uiPhaseTimer; uint32 uiPhaseTimer;
uint64 uiSphereGuids[2]; uint64 uiEmbraceTarget;
Unit *pEmbraceTarget;
Unit *pSphereTarget;
Creature* pSpheres[3];
CombatPhase Phase; CombatPhase Phase;
@@ -116,7 +111,7 @@ struct boss_taldaramAI : public ScriptedAI
uiEmbraceTakenDamage = 0; uiEmbraceTakenDamage = 0;
Phase = NORMAL; Phase = NORMAL;
uiPhaseTimer = 0; uiPhaseTimer = 0;
pEmbraceTarget = NULL; uiEmbraceTarget = 0;
if (pInstance) if (pInstance)
pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED); pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED);
} }
@@ -137,9 +132,12 @@ struct boss_taldaramAI : public ScriptedAI
switch (Phase) switch (Phase)
{ {
case CASTING_FLAME_SPHERES: case CASTING_FLAME_SPHERES:
{
Creature* pSpheres[3];
//DoCast(m_creature, SPELL_FLAME_SPHERE_SUMMON_1); //DoCast(m_creature, SPELL_FLAME_SPHERE_SUMMON_1);
pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
pSphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); Unit *pSphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (pSphereTarget && pSpheres[0]) if (pSphereTarget && pSpheres[0])
{ {
float angle,x,y; float angle,x,y;
@@ -171,8 +169,9 @@ struct boss_taldaramAI : public ScriptedAI
Phase = NORMAL; Phase = NORMAL;
uiPhaseTimer = 0; uiPhaseTimer = 0;
break; break;
}
case JUST_VANISHED: case JUST_VANISHED:
if(pEmbraceTarget) if (Unit *pEmbraceTarget = GetEmbraceTarget())
{ {
m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->Clear();
m_creature->SetSpeed(MOVE_WALK, 2.0f, true); m_creature->SetSpeed(MOVE_WALK, 2.0f, true);
@@ -182,7 +181,7 @@ struct boss_taldaramAI : public ScriptedAI
uiPhaseTimer = 1300; uiPhaseTimer = 1300;
break; break;
case VANISHED: case VANISHED:
if(pEmbraceTarget) if (Unit *pEmbraceTarget = GetEmbraceTarget())
DoCast(pEmbraceTarget, DUNGEON_MODE(SPELL_EMBRACE_OF_THE_VAMPYR, H_SPELL_EMBRACE_OF_THE_VAMPYR)); DoCast(pEmbraceTarget, DUNGEON_MODE(SPELL_EMBRACE_OF_THE_VAMPYR, H_SPELL_EMBRACE_OF_THE_VAMPYR));
m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->Clear();
m_creature->SetSpeed(MOVE_WALK, 1.0f, true); m_creature->SetSpeed(MOVE_WALK, 1.0f, true);
@@ -193,7 +192,7 @@ struct boss_taldaramAI : public ScriptedAI
case FEEDING: case FEEDING:
Phase = NORMAL; Phase = NORMAL;
uiPhaseTimer = 0; uiPhaseTimer = 0;
pEmbraceTarget = NULL; uiEmbraceTarget = 0;
break; break;
case NORMAL: case NORMAL:
if (uiBloodthirstTimer <= diff) if (uiBloodthirstTimer <= diff)
@@ -231,7 +230,9 @@ struct boss_taldaramAI : public ScriptedAI
DoCast(m_creature, SPELL_VANISH); DoCast(m_creature, SPELL_VANISH);
Phase = JUST_VANISHED; Phase = JUST_VANISHED;
uiPhaseTimer = 500; uiPhaseTimer = 500;
pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
uiEmbraceTarget = pEmbraceTarget->GetGUID();
} }
uiVanishTimer = urand(25000,35000); uiVanishTimer = urand(25000,35000);
} else uiVanishTimer -= diff; } else uiVanishTimer -= diff;
@@ -244,6 +245,8 @@ struct boss_taldaramAI : public ScriptedAI
void DamageTaken(Unit* done_by, uint32 &damage) void DamageTaken(Unit* done_by, uint32 &damage)
{ {
Unit* pEmbraceTarget = GetEmbraceTarget();
if (Phase == FEEDING && pEmbraceTarget && pEmbraceTarget->isAlive()) if (Phase == FEEDING && pEmbraceTarget && pEmbraceTarget->isAlive())
{ {
uiEmbraceTakenDamage += damage; uiEmbraceTakenDamage += damage;
@@ -251,7 +254,7 @@ struct boss_taldaramAI : public ScriptedAI
{ {
Phase = NORMAL; Phase = NORMAL;
uiPhaseTimer = 0; uiPhaseTimer = 0;
pEmbraceTarget = NULL; uiEmbraceTarget = 0;
m_creature->CastStop(); m_creature->CastStop();
} }
} }
@@ -282,11 +285,13 @@ struct boss_taldaramAI : public ScriptedAI
{ {
if (victim == m_creature) if (victim == m_creature)
return; return;
Unit* pEmbraceTarget = GetEmbraceTarget();
if (Phase == FEEDING && pEmbraceTarget && victim == pEmbraceTarget) if (Phase == FEEDING && pEmbraceTarget && victim == pEmbraceTarget)
{ {
Phase = NORMAL; Phase = NORMAL;
uiPhaseTimer = 0; uiPhaseTimer = 0;
pEmbraceTarget = NULL; uiEmbraceTarget = 0;
} }
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
} }
@@ -295,22 +300,31 @@ struct boss_taldaramAI : public ScriptedAI
{ {
if(!pInstance) if(!pInstance)
return false; return false;
uint64 uiSphereGuids[2];
uiSphereGuids[0] = pInstance->GetData64(DATA_SPHERE1); uiSphereGuids[0] = pInstance->GetData64(DATA_SPHERE1);
uiSphereGuids[1] = pInstance->GetData64(DATA_SPHERE2); uiSphereGuids[1] = pInstance->GetData64(DATA_SPHERE2);
GameObject *pSpheres[2];
for (uint8 i=0; i < 2; ++i) for (uint8 i=0; i < 2; ++i)
{ {
pSpheres[i] = pInstance->instance->GetGameObject(uiSphereGuids[i]); GameObject *pSpheres = pInstance->instance->GetGameObject(uiSphereGuids[i]);
if (!pSpheres[i]) if (!pSpheres)
return false; return false;
if (pSpheres[i]->GetGoState() != GO_STATE_ACTIVE) if (pSpheres->GetGoState() != GO_STATE_ACTIVE)
return false; return false;
} }
RemovePrison(); RemovePrison();
return true; return true;
} }
Unit* GetEmbraceTarget()
{
if (!uiEmbraceTarget)
return NULL;
return Unit::GetUnit(*m_creature, uiEmbraceTarget);
}
void RemovePrison() void RemovePrison()
{ {
if(!pInstance) if(!pInstance)