Fix crash in Prince Taldaram script.
Fixes issue #884. --HG-- branch : trunk
This commit is contained in:
@@ -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;
|
||||||
@@ -170,9 +168,10 @@ 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);
|
||||||
@@ -180,21 +179,21 @@ struct boss_taldaramAI : public ScriptedAI
|
|||||||
}
|
}
|
||||||
Phase = VANISHED;
|
Phase = VANISHED;
|
||||||
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);
|
||||||
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
|
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
|
||||||
Phase = FEEDING;
|
Phase = FEEDING;
|
||||||
uiPhaseTimer = 20000;
|
uiPhaseTimer = 20000;
|
||||||
break;
|
break;
|
||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user