Violet Hold: Complete Erekem boss script

Complete GO handling

--HG--
branch : trunk
This commit is contained in:
tartalo
2009-10-20 01:25:06 +02:00
parent 779540ca78
commit 7691c5e1c5
4 changed files with 49 additions and 12 deletions
@@ -63,10 +63,10 @@ struct TRINITY_DLL_DECL boss_erekemAI : public ScriptedAI
uiEarthShockTimer = urand(2000,8000); uiEarthShockTimer = urand(2000,8000);
uiLightningBoltTimer = urand(5000,10000); uiLightningBoltTimer = urand(5000,10000);
uiEarthShieldTimer = 20000; uiEarthShieldTimer = 20000;
pGuard1 = NULL;
pGuard2 = NULL;
if (pInstance) if (pInstance)
{ {
pGuard1 = pInstance->instance->GetCreature(pInstance->GetData(DATA_EREKEM_GUARD_1));
pGuard2 = pInstance->instance->GetCreature(pInstance->GetData(DATA_EREKEM_GUARD_2));
if (pInstance->GetData(DATA_WAVE_COUNT) == 6) if (pInstance->GetData(DATA_WAVE_COUNT) == 6)
pInstance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); pInstance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED);
else if (pInstance->GetData(DATA_WAVE_COUNT) == 12) else if (pInstance->GetData(DATA_WAVE_COUNT) == 12)
@@ -115,7 +115,7 @@ struct TRINITY_DLL_DECL boss_erekemAI : public ScriptedAI
{ {
if (Creature *pTarget = GetChainHealTarget()) if (Creature *pTarget = GetChainHealTarget())
{ {
DoCast(pTarget,HeroicMode ? H_SPELL_CHAIN_HEAL : SPELL_CHAIN_HEAL); DoCast(pTarget, HEROIC(SPELL_CHAIN_HEAL,H_SPELL_CHAIN_HEAL));
//If one of the adds is dead spawn heals faster //If one of the adds is dead spawn heals faster
uiChainHealTimer = ((pGuard1 && !pGuard1->isAlive()) || (pGuard2 && !pGuard2->isAlive()) ? 3000 : 8000) + rand()%3000; uiChainHealTimer = ((pGuard1 && !pGuard1->isAlive()) || (pGuard2 && !pGuard2->isAlive()) ? 3000 : 8000) + rand()%3000;
} }
@@ -171,8 +171,13 @@ struct TRINITY_DLL_DECL boss_erekemAI : public ScriptedAI
Creature* GetChainHealTarget() Creature* GetChainHealTarget()
{ {
Creature* pTarget = NULL; if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 85)
return pTarget; return m_creature;
if (pGuard1 && pGuard1->isAlive() && (pGuard1->GetHealth()*100 / pGuard1->GetMaxHealth() <= 75))
return pGuard1;
if (pGuard2 && pGuard2->isAlive() && (pGuard2->GetHealth()*100 / pGuard2->GetMaxHealth() <= 75))
return pGuard2;
return NULL;
} }
}; };
@@ -60,8 +60,6 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI
{ {
Phase = BUBBLED; Phase = BUBBLED;
DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE);
if (pInstance) if (pInstance)
{ {
if (pInstance->GetData(DATA_WAVE_COUNT) == 6) if (pInstance->GetData(DATA_WAVE_COUNT) == 6)
@@ -74,6 +72,8 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI
{ {
DoScriptText(SAY_AGGRO, m_creature); DoScriptText(SAY_AGGRO, m_creature);
DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE);
if (pInstance) if (pInstance)
{ {
if (pInstance->GetData(DATA_WAVE_COUNT) == 6) if (pInstance->GetData(DATA_WAVE_COUNT) == 6)
@@ -83,6 +83,8 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI
} }
} }
void MoveInLineOfSight(Unit* who) {}
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
//Return since we have no target //Return since we have no target
@@ -13,6 +13,8 @@ enum Data64
{ {
DATA_MORAGG, DATA_MORAGG,
DATA_EREKEM, DATA_EREKEM,
DATA_EREKEM_GUARD_1,
DATA_EREKEM_GUARD_2,
DATA_ICHORON, DATA_ICHORON,
DATA_LAVANTHOR, DATA_LAVANTHOR,
DATA_XEVOZZ, DATA_XEVOZZ,
@@ -20,8 +22,8 @@ enum Data64
DATA_CYANIGOSA, DATA_CYANIGOSA,
DATA_MORAGG_CELL, DATA_MORAGG_CELL,
DATA_EREKEM_CELL, DATA_EREKEM_CELL,
DATA_EREKEM_RIGHT_GUARD_CELL,
DATA_EREKEM_LEFT_GUARD_CELL, DATA_EREKEM_LEFT_GUARD_CELL,
DATA_EREKEM_RIGHT_GUARD_CELL,
DATA_ICHORON_CELL, DATA_ICHORON_CELL,
DATA_LAVANTHOR_CELL, DATA_LAVANTHOR_CELL,
DATA_XEVOZZ_CELL, DATA_XEVOZZ_CELL,
@@ -24,6 +24,7 @@ enum Creatures
CREATURE_ICHORON = 29313, CREATURE_ICHORON = 29313,
CREATURE_ZURAMAT = 29314, CREATURE_ZURAMAT = 29314,
CREATURE_EREKEM = 29315, CREATURE_EREKEM = 29315,
CREATURE_EREKEM_GUARD = 29395,
CREATURE_MORAGG = 29316, CREATURE_MORAGG = 29316,
CREATURE_CYANIGOSA = 31134, CREATURE_CYANIGOSA = 31134,
CREATURE_SINCLARI = 30658 CREATURE_SINCLARI = 30658
@@ -40,7 +41,7 @@ enum GameObjects
GO_EREKEM_GUARD_2_DOOR = 191562, GO_EREKEM_GUARD_2_DOOR = 191562,
GO_MORAGG_DOOR = 191606, GO_MORAGG_DOOR = 191606,
GO_INTRO_ACTIVATION_CRYSTAL = 193615, GO_INTRO_ACTIVATION_CRYSTAL = 193615,
GO_ACTIVATION_CRYSTAL_1 = 193611 GO_ACTIVATION_CRYSTAL = 193611
}; };
struct Location struct Location
{ {
@@ -58,6 +59,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
uint64 uiMoragg; uint64 uiMoragg;
uint64 uiErekem; uint64 uiErekem;
uint64 uiErekemGuard[2];
uint64 uiIchoron; uint64 uiIchoron;
uint64 uiLavanthor; uint64 uiLavanthor;
uint64 uiXevozz; uint64 uiXevozz;
@@ -67,20 +69,24 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
uint64 uiMoraggCell; uint64 uiMoraggCell;
uint64 uiErekemCell; uint64 uiErekemCell;
uint64 uiErekemRightGuardCell;
uint64 uiErekemLeftGuardCell; uint64 uiErekemLeftGuardCell;
uint64 uiErekemRightGuardCell;
uint64 uiIchoronCell; uint64 uiIchoronCell;
uint64 uiLavanthorCell; uint64 uiLavanthorCell;
uint64 uiXevozzCell; uint64 uiXevozzCell;
uint64 uiZuramatCell; uint64 uiZuramatCell;
uint64 uiMainDoor; uint64 uiMainDoor;
uint64 uiActivationCrystal[3];
uint8 uiWaveCount; uint8 uiWaveCount;
uint8 uiLocation; uint8 uiLocation;
uint8 uiFirstBoss; uint8 uiFirstBoss;
uint8 uiSecondBoss; uint8 uiSecondBoss;
uint8 m_auiEncounter[MAX_ENCOUNTER]; uint8 m_auiEncounter[MAX_ENCOUNTER];
uint8 uiCountErekemGuards;
uint8 uiCountActivationCrystals;
bool HeroicMode; bool HeroicMode;
@@ -99,8 +105,8 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
uiMoraggCell = 0; uiMoraggCell = 0;
uiErekemCell = 0; uiErekemCell = 0;
uiErekemRightGuardCell = 0; uiErekemGuard[0] = 0;
uiErekemLeftGuardCell = 0; uiErekemGuard[1] = 0;
uiIchoronCell = 0; uiIchoronCell = 0;
uiLavanthorCell = 0; uiLavanthorCell = 0;
uiXevozzCell = 0; uiXevozzCell = 0;
@@ -111,6 +117,8 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
uiLocation = 0; uiLocation = 0;
uiFirstBoss = 0; uiFirstBoss = 0;
uiSecondBoss = 0; uiSecondBoss = 0;
uiCountErekemGuards = 0;
uiCountActivationCrystals = 0;
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
} }
@@ -142,6 +150,10 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
case CREATURE_EREKEM: case CREATURE_EREKEM:
uiErekem = pCreature->GetGUID(); uiErekem = pCreature->GetGUID();
break; break;
case CREATURE_EREKEM_GUARD:
if (uiCountErekemGuards < 2)
uiErekemGuard[uiCountErekemGuards++] = pCreature->GetGUID();
break;
case CREATURE_MORAGG: case CREATURE_MORAGG:
uiMoragg = pCreature->GetGUID(); uiMoragg = pCreature->GetGUID();
break; break;
@@ -185,6 +197,10 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
case GO_MAIN_DOOR: case GO_MAIN_DOOR:
uiMainDoor = pGo->GetGUID(); uiMainDoor = pGo->GetGUID();
break; break;
case GO_ACTIVATION_CRYSTAL:
if (uiCountActivationCrystals < 3)
uiActivationCrystal[uiCountActivationCrystals++] = pGo->GetGUID();
break;
} }
} }
@@ -289,6 +305,16 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
} }
if (pBoss = instance->GetCreature(uiErekemGuard[0]))
{
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
if (pBoss = instance->GetCreature(uiErekemGuard[1]))
{
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
break; break;
case 2: //Ichoron case 2: //Ichoron
HandleGameObject(uiIchoronCell,true); HandleGameObject(uiIchoronCell,true);
@@ -331,6 +357,8 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
{ {
case DATA_MORAGG: return uiMoragg; case DATA_MORAGG: return uiMoragg;
case DATA_EREKEM: return uiErekem; case DATA_EREKEM: return uiErekem;
case DATA_EREKEM_GUARD_1: return uiErekemGuard[0];
case DATA_EREKEM_GUARD_2: return uiErekemGuard[1];
case DATA_ICHORON: return uiIchoron; case DATA_ICHORON: return uiIchoron;
case DATA_LAVANTHOR: return uiLavanthor; case DATA_LAVANTHOR: return uiLavanthor;
case DATA_XEVOZZ: return uiXevozz; case DATA_XEVOZZ: return uiXevozz;