Scripts/Trial of the Crusader: Made instance script a more readable, fixed early despawning of worm boss

Closes issue #3915.

--HG--
branch : trunk
extra : rebase_source : 7c086f0859bec23e53b2f9f9b2c458c48b9940df
This commit is contained in:
Shauren
2010-12-27 18:19:49 +01:00
parent 8b99f28e29
commit 8865d367c6
8 changed files with 1354 additions and 1240 deletions
@@ -108,14 +108,30 @@ public:
uint8 pos = urand(0, vHealersEntries.size()-1); uint8 pos = urand(0, vHealersEntries.size()-1);
switch (vHealersEntries[pos]) switch (vHealersEntries[pos])
{ {
case NPC_ALLIANCE_DRUID_RESTORATION: vOtherEntries.push_back(NPC_ALLIANCE_DRUID_BALANCE); break; case NPC_ALLIANCE_DRUID_RESTORATION:
case NPC_HORDE_DRUID_RESTORATION: vOtherEntries.push_back(NPC_HORDE_DRUID_BALANCE); break; vOtherEntries.push_back(NPC_ALLIANCE_DRUID_BALANCE);
case NPC_ALLIANCE_PALADIN_HOLY: vOtherEntries.push_back(NPC_ALLIANCE_PALADIN_RETRIBUTION); break; break;
case NPC_HORDE_PALADIN_HOLY: vOtherEntries.push_back(NPC_HORDE_PALADIN_RETRIBUTION); break; case NPC_HORDE_DRUID_RESTORATION:
case NPC_ALLIANCE_PRIEST_DISCIPLINE: vOtherEntries.push_back(NPC_ALLIANCE_PRIEST_SHADOW); break; vOtherEntries.push_back(NPC_HORDE_DRUID_BALANCE);
case NPC_HORDE_PRIEST_DISCIPLINE: vOtherEntries.push_back(NPC_HORDE_PRIEST_SHADOW); break; break;
case NPC_ALLIANCE_SHAMAN_RESTORATION: vOtherEntries.push_back(NPC_ALLIANCE_SHAMAN_ENHANCEMENT); break; case NPC_ALLIANCE_PALADIN_HOLY:
case NPC_HORDE_SHAMAN_RESTORATION: vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT); break; vOtherEntries.push_back(NPC_ALLIANCE_PALADIN_RETRIBUTION);
break;
case NPC_HORDE_PALADIN_HOLY:
vOtherEntries.push_back(NPC_HORDE_PALADIN_RETRIBUTION);
break;
case NPC_ALLIANCE_PRIEST_DISCIPLINE:
vOtherEntries.push_back(NPC_ALLIANCE_PRIEST_SHADOW);
break;
case NPC_HORDE_PRIEST_DISCIPLINE:
vOtherEntries.push_back(NPC_HORDE_PRIEST_SHADOW);
break;
case NPC_ALLIANCE_SHAMAN_RESTORATION:
vOtherEntries.push_back(NPC_ALLIANCE_SHAMAN_ENHANCEMENT);
break;
case NPC_HORDE_SHAMAN_RESTORATION:
vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT);
break;
} }
vHealersEntries.erase(vHealersEntries.begin()+pos); vHealersEntries.erase(vHealersEntries.begin()+pos);
} }
@@ -101,7 +101,7 @@ public:
{ {
boss_jaraxxusAI(Creature* pCreature) : ScriptedAI(pCreature), Summons(me) boss_jaraxxusAI(Creature* pCreature) : ScriptedAI(pCreature), Summons(me)
{ {
m_pInstance = (InstanceScript*)pCreature->GetInstanceScript(); m_pInstance = pCreature->GetInstanceScript();
Reset(); Reset();
} }
@@ -249,7 +249,6 @@ public:
}; };
class mob_legion_flame : public CreatureScript class mob_legion_flame : public CreatureScript
{ {
public: public:
@@ -276,14 +275,12 @@ public:
void UpdateAI(const uint32 /*uiDiff*/) void UpdateAI(const uint32 /*uiDiff*/)
{ {
if (!UpdateVictim()) UpdateVictim();
return;
} }
}; };
}; };
class mob_infernal_volcano : public CreatureScript class mob_infernal_volcano : public CreatureScript
{ {
public: public:
@@ -354,14 +351,12 @@ public:
m_Timer = 5*IN_MILLISECONDS; m_Timer = 5*IN_MILLISECONDS;
} else m_Timer -= uiDiff; } else m_Timer -= uiDiff;
if (!UpdateVictim()) UpdateVictim();
return;
} }
}; };
}; };
class mob_fel_infernal : public CreatureScript class mob_fel_infernal : public CreatureScript
{ {
public: public:
@@ -416,7 +411,6 @@ public:
}; };
class mob_nether_portal : public CreatureScript class mob_nether_portal : public CreatureScript
{ {
public: public:
@@ -481,14 +475,12 @@ public:
m_Timer = 15*IN_MILLISECONDS; m_Timer = 15*IN_MILLISECONDS;
} else m_Timer -= uiDiff; } else m_Timer -= uiDiff;
if (!UpdateVictim()) UpdateVictim();
return;
} }
}; };
}; };
class mob_mistress_of_pain : public CreatureScript class mob_mistress_of_pain : public CreatureScript
{ {
public: public:
@@ -562,7 +554,6 @@ public:
}; };
void AddSC_boss_jaraxxus() void AddSC_boss_jaraxxus()
{ {
new boss_jaraxxus(); new boss_jaraxxus();
@@ -359,62 +359,56 @@ public:
struct boss_jormungarAI : public ScriptedAI struct boss_jormungarAI : public ScriptedAI
{ {
boss_jormungarAI(Creature* pCreature) : ScriptedAI(pCreature) boss_jormungarAI(Creature* creature) : ScriptedAI(creature)
{ {
m_pInstance = (InstanceScript*)pCreature->GetInstanceScript(); instanceScript = creature->GetInstanceScript();
} }
InstanceScript* m_pInstance;
uint32 m_uiSisterID;
uint32 m_uiModelStationary;
uint32 m_uiModelMobile;
uint32 m_uiBiteSpell;
uint32 m_uiSpewSpell;
uint32 m_uiSpitSpell;
uint32 m_uiSpraySpell;
uint32 m_uiBiteTimer;
uint32 m_uiSpewTimer;
uint32 m_uiSlimePoolTimer;
uint32 m_uiSpitTimer;
uint32 m_uiSprayTimer;
uint32 m_uiSweepTimer;
uint32 m_uiSubmergeTimer;
uint8 m_uiStage;
bool m_bEnraged;
void Reset() void Reset()
{ {
m_bEnraged = false; enraged = false;
m_uiBiteTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); biteTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
m_uiSpewTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); spewTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
m_uiSlimePoolTimer = 15*IN_MILLISECONDS; slimePoolTimer = 15*IN_MILLISECONDS;
m_uiSpitTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); spitTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
m_uiSprayTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); sprayTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
m_uiSweepTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); sweepTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} }
void JustDied(Unit* /*pKiller*/) void JustDied(Unit* /*pKiller*/)
{ {
if (m_pInstance) if (instanceScript)
{ {
if (Creature* pSister = Unit::GetCreature((*me),m_pInstance->GetData64(m_uiSisterID))) if (Creature* otherWorm = Unit::GetCreature(*me, instanceScript->GetData64(otherWormEntry)))
{ {
if (!pSister->isAlive()) if (!otherWorm->isAlive())
m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE); {
instanceScript->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE);
if (TempSummon* summ = me->ToTempSummon())
summ->UnSummon();
else else
m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL); me->ForcedDespawn();
if (TempSummon* summ = otherWorm->ToTempSummon())
summ->UnSummon();
else
otherWorm->ForcedDespawn();
}
else
instanceScript->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL);
} }
} }
} }
void JustReachedHome() void JustReachedHome()
{ {
if (m_pInstance && m_pInstance->GetData(TYPE_NORTHREND_BEASTS) != FAIL) if (instanceScript && instanceScript->GetData(TYPE_NORTHREND_BEASTS) != FAIL)
m_pInstance->SetData(TYPE_NORTHREND_BEASTS, FAIL); instanceScript->SetData(TYPE_NORTHREND_BEASTS, FAIL);
if (TempSummon* summ = me->ToTempSummon())
summ->UnSummon();
else
me->ForcedDespawn(); me->ForcedDespawn();
} }
@@ -422,70 +416,71 @@ struct boss_jormungarAI : public ScriptedAI
{ {
if (pWho->GetTypeId() == TYPEID_PLAYER) if (pWho->GetTypeId() == TYPEID_PLAYER)
{ {
if (m_pInstance) if (instanceScript)
m_pInstance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); instanceScript->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0);
} }
} }
void EnterCombat(Unit* /*pWho*/) void EnterCombat(Unit* /*pWho*/)
{ {
me->SetInCombatWithZone(); me->SetInCombatWithZone();
if (m_pInstance) if (instanceScript)
m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_IN_PROGRESS); instanceScript->SetData(TYPE_NORTHREND_BEASTS, SNAKES_IN_PROGRESS);
} }
void UpdateAI(const uint32 uiDiff) void UpdateAI(const uint32 uiDiff)
{ {
if (!UpdateVictim()) return; if (!UpdateVictim()) return;
if (m_pInstance && m_pInstance->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL && !m_bEnraged) if (instanceScript && instanceScript->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL && !enraged)
{ {
DoScriptText(SAY_EMERGE, me); DoScriptText(SAY_EMERGE, me);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0); me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
DoCast(SPELL_ENRAGE); DoCast(SPELL_ENRAGE);
m_bEnraged = true; enraged = true;
DoScriptText(SAY_BERSERK, me); DoScriptText(SAY_BERSERK, me);
switch (m_uiStage) switch (stage)
{ {
case 0: break; case 0:
break;
case 4: case 4:
m_uiStage = 5; stage = 5;
m_uiSubmergeTimer = 5*IN_MILLISECONDS; submergeTimer = 5*IN_MILLISECONDS;
break; break;
default: default:
m_uiStage = 7; stage = 7;
} }
} }
switch (m_uiStage) switch (stage)
{ {
case 0: // Mobile case 0: // Mobile
if (m_uiBiteTimer <= uiDiff) if (biteTimer <= uiDiff)
{ {
DoCastVictim(m_uiBiteSpell); DoCastVictim(biteSpell);
m_uiBiteTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); biteTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} else m_uiBiteTimer -= uiDiff; } else biteTimer -= uiDiff;
if (m_uiSpewTimer <= uiDiff) if (spewTimer <= uiDiff)
{ {
DoCastAOE(m_uiSpewSpell); DoCastAOE(spewSpell);
m_uiSpewTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); spewTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} else m_uiSpewTimer -= uiDiff; } else spewTimer -= uiDiff;
if (m_uiSlimePoolTimer <= uiDiff) if (slimePoolTimer <= uiDiff)
{ {
/* Spell summon has only 30s duration */ /* Spell summon has only 30s duration */
//DoCast(SUMMON_SLIME_POOL); //DoCast(SUMMON_SLIME_POOL);
me->SummonCreature(NPC_SLIME_POOL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0); me->SummonCreature(NPC_SLIME_POOL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);
m_uiSlimePoolTimer = 30*IN_MILLISECONDS; slimePoolTimer = 30*IN_MILLISECONDS;
} else m_uiSlimePoolTimer -= uiDiff; } else slimePoolTimer -= uiDiff;
if (m_uiSubmergeTimer <= uiDiff && !m_bEnraged) if (submergeTimer <= uiDiff && !enraged)
{ {
m_uiStage = 1; stage = 1;
m_uiSubmergeTimer = 5*IN_MILLISECONDS; submergeTimer = 5*IN_MILLISECONDS;
} else m_uiSubmergeTimer -= uiDiff; } else submergeTimer -= uiDiff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
break; break;
@@ -494,16 +489,16 @@ struct boss_jormungarAI : public ScriptedAI
DoCast(me, SPELL_SUBMERGE_0); DoCast(me, SPELL_SUBMERGE_0);
DoScriptText(SAY_SUBMERGE, me); DoScriptText(SAY_SUBMERGE, me);
me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionY()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionZ()); me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionY()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionZ());
m_uiStage = 2; stage = 2;
case 2: // Wait til emerge case 2: // Wait til emerge
if (m_uiSubmergeTimer <= uiDiff) if (submergeTimer <= uiDiff)
{ {
m_uiStage = 3; stage = 3;
m_uiSubmergeTimer = 50*IN_MILLISECONDS; submergeTimer = 50*IN_MILLISECONDS;
} else m_uiSubmergeTimer -= uiDiff; } else submergeTimer -= uiDiff;
break; break;
case 3: // Emerge case 3: // Emerge
me->SetDisplayId(m_uiModelStationary); me->SetDisplayId(modelStationary);
DoScriptText(SAY_EMERGE, me); DoScriptText(SAY_EMERGE, me);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0); me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
DoCast(me, SPELL_EMERGE_0); DoCast(me, SPELL_EMERGE_0);
@@ -511,45 +506,45 @@ struct boss_jormungarAI : public ScriptedAI
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
SetCombatMovement(false); SetCombatMovement(false);
me->GetMotionMaster()->MoveIdle(); me->GetMotionMaster()->MoveIdle();
m_uiStage = 4; stage = 4;
break; break;
case 4: // Stationary case 4: // Stationary
if (m_uiSprayTimer <= uiDiff) if (sprayTimer <= uiDiff)
{ {
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget,m_uiSpraySpell); DoCast(pTarget, spraySpell);
m_uiSprayTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); sprayTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} else m_uiSprayTimer -= uiDiff; } else sprayTimer -= uiDiff;
if (m_uiSweepTimer <= uiDiff) if (sweepTimer <= uiDiff)
{ {
DoCastAOE(SPELL_SWEEP_0); DoCastAOE(SPELL_SWEEP_0);
m_uiSweepTimer = urand(15*IN_MILLISECONDS,30*IN_MILLISECONDS); sweepTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} else m_uiSweepTimer -= uiDiff; } else sweepTimer -= uiDiff;
if (m_uiSubmergeTimer <= uiDiff) if (submergeTimer <= uiDiff)
{ {
m_uiStage = 5; stage = 5;
m_uiSubmergeTimer = 10*IN_MILLISECONDS; submergeTimer = 10*IN_MILLISECONDS;
} else m_uiSubmergeTimer -= uiDiff; } else submergeTimer -= uiDiff;
DoSpellAttackIfReady(m_uiSpitSpell); DoSpellAttackIfReady(spitSpell);
break; break;
case 5: // Submerge case 5: // Submerge
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
DoCast(me, SPELL_SUBMERGE_0); DoCast(me, SPELL_SUBMERGE_0);
DoScriptText(SAY_SUBMERGE, me); DoScriptText(SAY_SUBMERGE, me);
me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionY()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionZ()); me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionY()+urand(0, 80)-40, ToCCommonLoc[1].GetPositionZ());
m_uiStage = 6; stage = 6;
case 6: // Wait til emerge case 6: // Wait til emerge
if (m_uiSubmergeTimer <= uiDiff) if (submergeTimer <= uiDiff)
{ {
m_uiStage = 7; stage = 7;
m_uiSubmergeTimer = 45*IN_MILLISECONDS; submergeTimer = 45*IN_MILLISECONDS;
} else m_uiSubmergeTimer -= uiDiff; } else submergeTimer -= uiDiff;
break; break;
case 7: // Emerge case 7: // Emerge
me->SetDisplayId(m_uiModelMobile); me->SetDisplayId(modelMobile);
DoScriptText(SAY_EMERGE, me); DoScriptText(SAY_EMERGE, me);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0); me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
DoCast(me, SPELL_EMERGE_0); DoCast(me, SPELL_EMERGE_0);
@@ -557,10 +552,32 @@ struct boss_jormungarAI : public ScriptedAI
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
SetCombatMovement(true); SetCombatMovement(true);
me->GetMotionMaster()->MoveChase(me->getVictim()); me->GetMotionMaster()->MoveChase(me->getVictim());
m_uiStage = 0; stage = 0;
break; break;
} }
} }
InstanceScript* instanceScript;
uint32 otherWormEntry;
uint32 modelStationary;
uint32 modelMobile;
uint32 biteSpell;
uint32 spewSpell;
uint32 spitSpell;
uint32 spraySpell;
uint32 biteTimer;
uint32 spewTimer;
uint32 slimePoolTimer;
uint32 spitTimer;
uint32 sprayTimer;
uint32 sweepTimer;
uint32 submergeTimer;
uint8 stage;
bool enraged;
}; };
@@ -569,11 +586,6 @@ class boss_acidmaw : public CreatureScript
public: public:
boss_acidmaw() : CreatureScript("boss_acidmaw") { } boss_acidmaw() : CreatureScript("boss_acidmaw") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_acidmawAI(pCreature);
}
struct boss_acidmawAI : public boss_jormungarAI struct boss_acidmawAI : public boss_jormungarAI
{ {
boss_acidmawAI(Creature* pCreature) : boss_jormungarAI(pCreature) { } boss_acidmawAI(Creature* pCreature) : boss_jormungarAI(pCreature) { }
@@ -581,20 +593,24 @@ class boss_acidmaw : public CreatureScript
void Reset() void Reset()
{ {
boss_jormungarAI::Reset(); boss_jormungarAI::Reset();
m_uiBiteSpell = SPELL_PARALYTIC_BITE; biteSpell = SPELL_PARALYTIC_BITE;
m_uiSpewSpell = SPELL_ACID_SPEW; spewSpell = SPELL_ACID_SPEW;
m_uiSpitSpell = SPELL_ACID_SPIT; spitSpell = SPELL_ACID_SPIT;
m_uiSpraySpell = SPELL_PARALYTIC_SPRAY; spraySpell = SPELL_PARALYTIC_SPRAY;
m_uiModelStationary = MODEL_ACIDMAW_STATIONARY; modelStationary = MODEL_ACIDMAW_STATIONARY;
m_uiModelMobile = MODEL_ACIDMAW_MOBILE; modelMobile = MODEL_ACIDMAW_MOBILE;
m_uiSisterID = NPC_DREADSCALE; otherWormEntry = NPC_DREADSCALE;
m_uiSubmergeTimer = 500; submergeTimer = 500;
DoCast(me, SPELL_SUBMERGE_0); DoCast(me, SPELL_SUBMERGE_0);
m_uiStage = 2; stage = 2;
} }
}; };
CreatureAI* GetAI(Creature* creature) const
{
return new boss_acidmawAI(creature);
}
}; };
@@ -603,11 +619,6 @@ class boss_dreadscale : public CreatureScript
public: public:
boss_dreadscale() : CreatureScript("boss_dreadscale") { } boss_dreadscale() : CreatureScript("boss_dreadscale") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_dreadscaleAI(pCreature);
}
struct boss_dreadscaleAI : public boss_jormungarAI struct boss_dreadscaleAI : public boss_jormungarAI
{ {
boss_dreadscaleAI(Creature* pCreature) : boss_jormungarAI(pCreature) { } boss_dreadscaleAI(Creature* pCreature) : boss_jormungarAI(pCreature) { }
@@ -615,19 +626,23 @@ public:
void Reset() void Reset()
{ {
boss_jormungarAI::Reset(); boss_jormungarAI::Reset();
m_uiBiteSpell = SPELL_BURNING_BITE; biteSpell = SPELL_BURNING_BITE;
m_uiSpewSpell = SPELL_MOLTEN_SPEW; spewSpell = SPELL_MOLTEN_SPEW;
m_uiSpitSpell = SPELL_FIRE_SPIT; spitSpell = SPELL_FIRE_SPIT;
m_uiSpraySpell = SPELL_BURNING_SPRAY; spraySpell = SPELL_BURNING_SPRAY;
m_uiModelStationary = MODEL_DREADSCALE_STATIONARY; modelStationary = MODEL_DREADSCALE_STATIONARY;
m_uiModelMobile = MODEL_DREADSCALE_MOBILE; modelMobile = MODEL_DREADSCALE_MOBILE;
m_uiSisterID = NPC_ACIDMAW; otherWormEntry = NPC_ACIDMAW;
m_uiSubmergeTimer = 45*IN_MILLISECONDS; submergeTimer = 45 * IN_MILLISECONDS;
m_uiStage = 0; stage = 0;
} }
}; };
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_dreadscaleAI(pCreature);
}
}; };
@@ -31,154 +31,174 @@ class instance_trial_of_the_crusader : public InstanceMapScript
public: public:
instance_trial_of_the_crusader() : InstanceMapScript("instance_trial_of_the_crusader", 649) { } instance_trial_of_the_crusader() : InstanceMapScript("instance_trial_of_the_crusader", 649) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
return new instance_trial_of_the_crusader_InstanceMapScript(pMap);
}
struct instance_trial_of_the_crusader_InstanceMapScript : public InstanceScript struct instance_trial_of_the_crusader_InstanceMapScript : public InstanceScript
{ {
instance_trial_of_the_crusader_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();}; instance_trial_of_the_crusader_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
uint32 m_auiEncounter[MAX_ENCOUNTERS]; uint32 EncounterStatus[MAX_ENCOUNTERS];
uint32 m_uiTrialCounter; uint32 TrialCounter;
uint32 m_uiEvent; uint32 EventStage;
uint32 m_uiEventTimer; uint32 EventTimer;
uint32 m_uiEventNPCId; uint32 EventNPCId;
uint32 m_uiNorthrendBeasts; uint32 NorthrendBeasts;
std::string m_strInstData; std::string SaveDataBuffer;
bool m_bNeedSave; bool NeedSave;
uint32 m_uiDataDamageTwin; uint32 DataDamageTwin;
uint32 m_uiFjolaCasting; uint32 FjolaCasting;
uint32 m_uiEydisCasting; uint32 EydisCasting;
uint64 m_uiBarrentGUID; uint64 BarrentGUID;
uint64 m_uiTirionGUID; uint64 TirionGUID;
uint64 m_uiFizzlebangGUID; uint64 FizzlebangGUID;
uint64 m_uiGarroshGUID; uint64 GarroshGUID;
uint64 m_uiVarianGUID; uint64 VarianGUID;
uint64 m_uiGormokGUID; uint64 GormokGUID;
uint64 m_uiAcidmawGUID; uint64 AcidmawGUID;
uint64 m_uiDreadscaleGUID; uint64 DreadscaleGUID;
uint64 m_uiIcehowlGUID; uint64 IcehowlGUID;
uint64 m_uiJaraxxusGUID; uint64 JaraxxusGUID;
uint64 m_uiChampionsControllerGUID; uint64 ChampionsControllerGUID;
uint64 m_uiDarkbaneGUID; uint64 DarkbaneGUID;
uint64 m_uiLightbaneGUID; uint64 LightbaneGUID;
uint64 m_uiAnubarakGUID; uint64 AnubarakGUID;
uint64 m_uiCrusadersCacheGUID; uint64 CrusadersCacheGUID;
uint64 m_uiFloorGUID; uint64 FloorGUID;
uint64 m_uiTributeChestGUID; uint64 TributeChestGUID;
uint64 m_uiMainGateDoorGUID; uint64 MainGateDoorGUID;
uint64 m_uiEastPortcullisGUID; uint64 EastPortcullisGUID;
uint64 m_uiWebDoorGUID; uint64 WebDoorGUID;
// Achievement stuff // Achievement stuff
uint32 m_uiNotOneButTwoJormungarsTimer; uint32 NotOneButTwoJormungarsTimer;
uint32 m_uiResilienceWillFixItTimer; uint32 ResilienceWillFixItTimer;
uint8 m_uiSnoboldCount; uint8 SnoboldCount;
uint8 m_uiMistressOfPainCount; uint8 MistressOfPainCount;
bool m_bTributeToImmortalityElegible; bool TributeToImmortalityElegible;
std::list<uint32> m_vScarabTimeOfDeath;
void Initialize() void Initialize()
{ {
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
m_auiEncounter[i] = NOT_STARTED; EncounterStatus[i] = NOT_STARTED;
m_uiTrialCounter = 50; TrialCounter = 50;
m_uiEvent = 0; EventStage = 0;
m_uiTributeChestGUID = 0; TributeChestGUID = 0;
m_uiDataDamageTwin = 0; DataDamageTwin = 0;
m_uiMainGateDoorGUID = 0; MainGateDoorGUID = 0;
m_uiEastPortcullisGUID = 0; EastPortcullisGUID = 0;
m_uiWebDoorGUID = 0; WebDoorGUID = 0;
m_uiNorthrendBeasts = NOT_STARTED; NorthrendBeasts = NOT_STARTED;
m_uiEventTimer = 1000; EventTimer = 1000;
m_uiNotOneButTwoJormungarsTimer = 0; NotOneButTwoJormungarsTimer = 0;
m_uiResilienceWillFixItTimer = 0; ResilienceWillFixItTimer = 0;
m_uiSnoboldCount = 0; SnoboldCount = 0;
m_uiMistressOfPainCount = 0; MistressOfPainCount = 0;
m_bTributeToImmortalityElegible = true; TributeToImmortalityElegible = true;
m_bNeedSave = false; NeedSave = false;
} }
bool IsEncounterInProgress() const bool IsEncounterInProgress() const
{ {
for (uint8 i = 0; i < MAX_ENCOUNTERS ; ++i) for (uint8 i = 0; i < MAX_ENCOUNTERS ; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) if (EncounterStatus[i] == IN_PROGRESS)
return true; return true;
return false; return false;
} }
void OnPlayerEnter(Player *m_player) void OnPlayerEnter(Player* player)
{ {
if (instance->IsHeroic()) if (instance->IsHeroic())
{ {
m_player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW,1); player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW, 1);
m_player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, GetData(TYPE_COUNTER)); player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, GetData(TYPE_COUNTER));
} }
} }
bool IsRaidWiped() bool IsRaidWiped()
{ {
Map::PlayerList const &players = instance->GetPlayers(); Map::PlayerList const &players = instance->GetPlayers();
for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
{ if (Player* player = i->getSource())
if (Player* pPlayer = i->getSource()) if (player->isAlive())
{
if (pPlayer->isAlive())
return false; return false;
}
}
return true; return true;
} }
void OpenDoor(uint64 guid) void OpenDoor(uint64 guid)
{ {
if (!guid) return; if (!guid)
GameObject* go = instance->GetGameObject(guid); return;
if (go) go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); if (GameObject* go = instance->GetGameObject(guid))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
} }
void CloseDoor(uint64 guid) void CloseDoor(uint64 guid)
{ {
if (!guid) return; if (!guid)
GameObject* go = instance->GetGameObject(guid); return;
if (go) go->SetGoState(GO_STATE_READY); if (GameObject* go = instance->GetGameObject(guid))
go->SetGoState(GO_STATE_READY);
} }
void OnCreatureCreate(Creature* creature) void OnCreatureCreate(Creature* creature)
{ {
switch (creature->GetEntry()) switch (creature->GetEntry())
{ {
case NPC_BARRENT: m_uiBarrentGUID = creature->GetGUID(); break; case NPC_BARRENT:
case NPC_TIRION: m_uiTirionGUID = creature->GetGUID(); break; BarrentGUID = creature->GetGUID();
case NPC_FIZZLEBANG: m_uiFizzlebangGUID = creature->GetGUID(); break; break;
case NPC_GARROSH: m_uiGarroshGUID = creature->GetGUID(); break; case NPC_TIRION:
case NPC_VARIAN: m_uiVarianGUID = creature->GetGUID(); break; TirionGUID = creature->GetGUID();
break;
case NPC_FIZZLEBANG:
FizzlebangGUID = creature->GetGUID();
break;
case NPC_GARROSH:
GarroshGUID = creature->GetGUID();
break;
case NPC_VARIAN:
VarianGUID = creature->GetGUID();
break;
case NPC_GORMOK: m_uiGormokGUID = creature->GetGUID(); break; case NPC_GORMOK:
case NPC_ACIDMAW: m_uiAcidmawGUID = creature->GetGUID(); break; GormokGUID = creature->GetGUID();
case NPC_DREADSCALE: m_uiDreadscaleGUID = creature->GetGUID(); break; break;
case NPC_ICEHOWL: m_uiIcehowlGUID = creature->GetGUID(); break; case NPC_ACIDMAW:
case NPC_JARAXXUS: m_uiJaraxxusGUID = creature->GetGUID(); break; AcidmawGUID = creature->GetGUID();
case NPC_CHAMPIONS_CONTROLLER: m_uiChampionsControllerGUID = creature->GetGUID(); break; break;
case NPC_DARKBANE: m_uiDarkbaneGUID = creature->GetGUID(); break; case NPC_DREADSCALE:
case NPC_LIGHTBANE: m_uiLightbaneGUID = creature->GetGUID(); break; DreadscaleGUID = creature->GetGUID();
case NPC_ANUBARAK: m_uiAnubarakGUID = creature->GetGUID(); break; break;
case NPC_ICEHOWL:
IcehowlGUID = creature->GetGUID();
break;
case NPC_JARAXXUS:
JaraxxusGUID = creature->GetGUID();
break;
case NPC_CHAMPIONS_CONTROLLER:
ChampionsControllerGUID = creature->GetGUID();
break;
case NPC_DARKBANE:
DarkbaneGUID = creature->GetGUID();
break;
case NPC_LIGHTBANE:
LightbaneGUID = creature->GetGUID();
break;
case NPC_ANUBARAK:
AnubarakGUID = creature->GetGUID();
break;
} }
} }
@@ -188,24 +208,32 @@ public:
{ {
case GO_CRUSADERS_CACHE_10: case GO_CRUSADERS_CACHE_10:
if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL) if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL)
m_uiCrusadersCacheGUID = go->GetGUID(); CrusadersCacheGUID = go->GetGUID();
break; break;
case GO_CRUSADERS_CACHE_25: case GO_CRUSADERS_CACHE_25:
if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL) if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL)
m_uiCrusadersCacheGUID = go->GetGUID(); CrusadersCacheGUID = go->GetGUID();
break; break;
case GO_CRUSADERS_CACHE_10_H: case GO_CRUSADERS_CACHE_10_H:
if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
m_uiCrusadersCacheGUID = go->GetGUID(); CrusadersCacheGUID = go->GetGUID();
break; break;
case GO_CRUSADERS_CACHE_25_H: case GO_CRUSADERS_CACHE_25_H:
if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
m_uiCrusadersCacheGUID = go->GetGUID(); CrusadersCacheGUID = go->GetGUID();
break;
case GO_ARGENT_COLISEUM_FLOOR:
FloorGUID = go->GetGUID();
break;
case GO_MAIN_GATE_DOOR:
MainGateDoorGUID = go->GetGUID();
break;
case GO_EAST_PORTCULLIS:
EastPortcullisGUID = go->GetGUID();
break;
case GO_WEB_DOOR:
WebDoorGUID = go->GetGUID();
break; break;
case GO_ARGENT_COLISEUM_FLOOR: m_uiFloorGUID = go->GetGUID(); break;
case GO_MAIN_GATE_DOOR: m_uiMainGateDoorGUID = go->GetGUID(); break;
case GO_EAST_PORTCULLIS: m_uiEastPortcullisGUID = go->GetGUID(); break;
case GO_WEB_DOOR: m_uiWebDoorGUID = go->GetGUID(); break;
case GO_TRIBUTE_CHEST_10H_25: case GO_TRIBUTE_CHEST_10H_25:
case GO_TRIBUTE_CHEST_10H_45: case GO_TRIBUTE_CHEST_10H_45:
@@ -215,117 +243,134 @@ public:
case GO_TRIBUTE_CHEST_25H_45: case GO_TRIBUTE_CHEST_25H_45:
case GO_TRIBUTE_CHEST_25H_50: case GO_TRIBUTE_CHEST_25H_50:
case GO_TRIBUTE_CHEST_25H_99: case GO_TRIBUTE_CHEST_25H_99:
m_uiTributeChestGUID = go->GetGUID(); break; TributeChestGUID = go->GetGUID();
break;
} }
} }
void SetData(uint32 uiType, uint32 uiData) void SetData(uint32 type, uint32 data)
{ {
switch(uiType) switch (type)
{ {
case TYPE_JARAXXUS: case TYPE_JARAXXUS:
if (uiData == DONE) m_uiEvent = 2000; if (data == DONE)
EventStage = 2000;
break; break;
case TYPE_CRUSADERS: case TYPE_CRUSADERS:
switch (uiData) switch (data)
{ {
case IN_PROGRESS: m_uiResilienceWillFixItTimer = 0; break; case IN_PROGRESS:
ResilienceWillFixItTimer = 0;
break;
case SPECIAL: //Means the first blood case SPECIAL: //Means the first blood
m_uiResilienceWillFixItTimer = 60*IN_MILLISECONDS; ResilienceWillFixItTimer = 60*IN_MILLISECONDS;
uiData = IN_PROGRESS; data = IN_PROGRESS;
break; break;
case DONE: case DONE:
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS); DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
if (m_uiResilienceWillFixItTimer > 0) if (ResilienceWillFixItTimer > 0)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE); DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
if (GameObject* pChest = instance->GetGameObject(m_uiCrusadersCacheGUID)) DoRespawnGameObject(CrusadersCacheGUID, 7*DAY);
if (pChest && !pChest->isSpawned()) EventStage = 3100;
pChest->SetRespawnTime(7*DAY);
m_uiEvent = 3100;
break; break;
} }
break; break;
case TYPE_VALKIRIES: case TYPE_VALKIRIES:
switch (uiData) switch (data)
{ {
case FAIL: case FAIL:
if (m_auiEncounter[TYPE_VALKIRIES] == NOT_STARTED) uiData = NOT_STARTED; if (EncounterStatus[TYPE_VALKIRIES] == NOT_STARTED)
data = NOT_STARTED;
break; break;
case SPECIAL: case SPECIAL:
if (m_auiEncounter[TYPE_VALKIRIES] == SPECIAL) uiData = DONE; if (EncounterStatus[TYPE_VALKIRIES] == SPECIAL)
data = DONE;
break; break;
case DONE: case DONE:
if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE) if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE)
m_uiEvent = 4020; EventStage = 4020;
else else
m_uiEvent = 4030; EventStage = 4030;
break; break;
} }
break; break;
case TYPE_ANUBARAK: case TYPE_ANUBARAK:
switch (uiData) switch (data)
{ {
case DONE: case DONE:
m_uiEvent = 6000; EventStage = 6000;
break; break;
case SPECIAL: case SPECIAL:
uint32 tributeChest = 0; uint32 tributeChest = 0;
if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
{ {
if (m_uiTrialCounter >= 50) if (TrialCounter >= 50)
tributeChest = GO_TRIBUTE_CHEST_10H_99; tributeChest = GO_TRIBUTE_CHEST_10H_99;
else else
if (m_uiTrialCounter >= 45) if (TrialCounter >= 45)
tributeChest = GO_TRIBUTE_CHEST_10H_50; tributeChest = GO_TRIBUTE_CHEST_10H_50;
else else
if (m_uiTrialCounter >= 25) if (TrialCounter >= 25)
tributeChest = GO_TRIBUTE_CHEST_10H_45; tributeChest = GO_TRIBUTE_CHEST_10H_45;
else else
tributeChest = GO_TRIBUTE_CHEST_10H_25; tributeChest = GO_TRIBUTE_CHEST_10H_25;
} }
else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
{ {
if (m_uiTrialCounter >= 50) if (TrialCounter >= 50)
tributeChest = GO_TRIBUTE_CHEST_25H_99; tributeChest = GO_TRIBUTE_CHEST_25H_99;
else else
if (m_uiTrialCounter >= 45) if (TrialCounter >= 45)
tributeChest = GO_TRIBUTE_CHEST_25H_50; tributeChest = GO_TRIBUTE_CHEST_25H_50;
else else
if (m_uiTrialCounter >= 25) if (TrialCounter >= 25)
tributeChest = GO_TRIBUTE_CHEST_25H_45; tributeChest = GO_TRIBUTE_CHEST_25H_45;
else else
tributeChest = GO_TRIBUTE_CHEST_25H_25; tributeChest = GO_TRIBUTE_CHEST_25H_25;
} }
if (tributeChest) if (tributeChest)
if (Creature* pTirion = instance->GetCreature(m_uiTirionGUID)) if (Creature* tirion = instance->GetCreature(TirionGUID))
if (GameObject* pChest = pTirion->SummonGameObject(tributeChest,805.62f,134.87f,142.16f,3.27f,0,0,0,0,90000000)) if (GameObject* chest = tirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, 90000000))
pChest->SetRespawnTime(pChest->GetRespawnDelay()); chest->SetRespawnTime(chest->GetRespawnDelay());
break; break;
} }
break; break;
case TYPE_COUNTER: m_uiTrialCounter = uiData; uiData = DONE; break; case TYPE_COUNTER:
case TYPE_EVENT: m_uiEvent = uiData; uiData = NOT_STARTED; break; TrialCounter = data;
case TYPE_EVENT_TIMER: m_uiEventTimer = uiData; uiData = NOT_STARTED; break; data = DONE;
break;
case TYPE_EVENT:
EventStage = data;
data = NOT_STARTED;
break;
case TYPE_EVENT_TIMER:
EventTimer = data;
data = NOT_STARTED;
break;
case TYPE_NORTHREND_BEASTS: case TYPE_NORTHREND_BEASTS:
m_uiNorthrendBeasts = uiData; NorthrendBeasts = data;
switch (uiData) switch (data)
{ {
case GORMOK_DONE: case GORMOK_DONE:
m_uiEvent = 200; EventStage = 200;
SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS);
SetData(TYPE_BEASTS, IN_PROGRESS); SetData(TYPE_BEASTS, IN_PROGRESS);
break; break;
case SNAKES_IN_PROGRESS: m_uiNotOneButTwoJormungarsTimer = 0; break; case SNAKES_IN_PROGRESS:
case SNAKES_SPECIAL: m_uiNotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS; break; NotOneButTwoJormungarsTimer = 0;
break;
case SNAKES_SPECIAL:
NotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS;
break;
case SNAKES_DONE: case SNAKES_DONE:
if (m_uiNotOneButTwoJormungarsTimer > 0) if (NotOneButTwoJormungarsTimer > 0)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS); DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS);
m_uiEvent = 300; EventStage = 300;
SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS);
SetData(TYPE_BEASTS, IN_PROGRESS); SetData(TYPE_BEASTS, IN_PROGRESS);
break; break;
case ICEHOWL_DONE: case ICEHOWL_DONE:
m_uiEvent = 400; EventStage = 400;
SetData(TYPE_NORTHREND_BEASTS, DONE); SetData(TYPE_NORTHREND_BEASTS, DONE);
SetData(TYPE_BEASTS, DONE); SetData(TYPE_BEASTS, DONE);
break; break;
@@ -334,102 +379,139 @@ public:
break; break;
} }
break; break;
case DATA_HEALTH_TWIN_SHARED: m_uiDataDamageTwin = uiData; uiData = NOT_STARTED; break; case DATA_HEALTH_TWIN_SHARED:
DataDamageTwin = data;
data = NOT_STARTED;
break;
//Achievements //Achievements
case DATA_SNOBOLD_COUNT: case DATA_SNOBOLD_COUNT:
if (uiData == INCREASE) if (data == INCREASE)
++m_uiSnoboldCount; ++SnoboldCount;
else if (uiData == DECREASE) else if (data == DECREASE)
--m_uiSnoboldCount; --SnoboldCount;
break; break;
case DATA_MISTRESS_OF_PAIN_COUNT: case DATA_MISTRESS_OF_PAIN_COUNT:
if (uiData == INCREASE) if (data == INCREASE)
++m_uiMistressOfPainCount; ++MistressOfPainCount;
else if (uiData == DECREASE) else if (data == DECREASE)
--m_uiMistressOfPainCount; --MistressOfPainCount;
break; break;
case DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE: case DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE:
m_bTributeToImmortalityElegible = false; TributeToImmortalityElegible = false;
break; break;
} }
if (IsEncounterInProgress()) if (IsEncounterInProgress())
{ {
CloseDoor(GetData64(GO_EAST_PORTCULLIS)); CloseDoor(GetData64(GO_EAST_PORTCULLIS));
CloseDoor(GetData64(GO_WEB_DOOR)); CloseDoor(GetData64(GO_WEB_DOOR));
} else { }
else
{
OpenDoor(GetData64(GO_EAST_PORTCULLIS)); OpenDoor(GetData64(GO_EAST_PORTCULLIS));
OpenDoor(GetData64(GO_WEB_DOOR)); OpenDoor(GetData64(GO_WEB_DOOR));
} }
if (uiType < MAX_ENCOUNTERS) if (type < MAX_ENCOUNTERS)
{ {
sLog->outBasic("[ToCr] m_auiEncounter[uiType %u] %u = uiData %u;",uiType,m_auiEncounter[uiType],uiData); sLog->outDetail("[ToCr] EncounterStatus[type %u] %u = data %u;", type, EncounterStatus[type], data);
if (uiData == FAIL) if (data == FAIL)
{ {
if (IsRaidWiped()) if (IsRaidWiped())
{ {
--m_uiTrialCounter; --TrialCounter;
m_bNeedSave = true; NeedSave = true;
m_uiEvent = (uiType == TYPE_BEASTS? 666 : 0); EventStage = (type == TYPE_BEASTS ? 666 : 0);
} }
uiData = NOT_STARTED; data = NOT_STARTED;
} }
m_auiEncounter[uiType] = uiData;
if (uiData == DONE || m_bNeedSave == true) EncounterStatus[type] = data;
if (data == DONE || NeedSave == true)
{ {
if (Unit* pAnnouncer = instance->GetCreature(GetData64(NPC_BARRENT))) if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT)))
pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Save(); Save();
} }
} }
} }
uint64 GetData64(uint32 uiData) uint64 GetData64(uint32 type)
{ {
switch(uiData) switch (type)
{ {
case NPC_BARRENT: return m_uiBarrentGUID; case NPC_BARRENT:
case NPC_TIRION: return m_uiTirionGUID; return BarrentGUID;
case NPC_FIZZLEBANG: return m_uiFizzlebangGUID; case NPC_TIRION:
case NPC_GARROSH: return m_uiGarroshGUID; return TirionGUID;
case NPC_VARIAN: return m_uiVarianGUID; case NPC_FIZZLEBANG:
return FizzlebangGUID;
case NPC_GARROSH:
return GarroshGUID;
case NPC_VARIAN:
return VarianGUID;
case NPC_GORMOK: return m_uiGormokGUID; case NPC_GORMOK:
case NPC_ACIDMAW: return m_uiAcidmawGUID; return GormokGUID;
case NPC_DREADSCALE: return m_uiDreadscaleGUID; case NPC_ACIDMAW:
case NPC_ICEHOWL: return m_uiIcehowlGUID; return AcidmawGUID;
case NPC_JARAXXUS: return m_uiJaraxxusGUID; case NPC_DREADSCALE:
case NPC_CHAMPIONS_CONTROLLER: return m_uiChampionsControllerGUID; return DreadscaleGUID;
case NPC_DARKBANE: return m_uiDarkbaneGUID; case NPC_ICEHOWL:
case NPC_LIGHTBANE: return m_uiLightbaneGUID; return IcehowlGUID;
case NPC_ANUBARAK: return m_uiAnubarakGUID; case NPC_JARAXXUS:
return JaraxxusGUID;
case NPC_CHAMPIONS_CONTROLLER:
return ChampionsControllerGUID;
case NPC_DARKBANE:
return DarkbaneGUID;
case NPC_LIGHTBANE:
return LightbaneGUID;
case NPC_ANUBARAK:
return AnubarakGUID;
case GO_ARGENT_COLISEUM_FLOOR: return m_uiFloorGUID; case GO_ARGENT_COLISEUM_FLOOR:
case GO_MAIN_GATE_DOOR: return m_uiMainGateDoorGUID; return FloorGUID;
case GO_EAST_PORTCULLIS: return m_uiEastPortcullisGUID; case GO_MAIN_GATE_DOOR:
case GO_WEB_DOOR: return m_uiWebDoorGUID; return MainGateDoorGUID;
case GO_EAST_PORTCULLIS:
return EastPortcullisGUID;
case GO_WEB_DOOR:
return WebDoorGUID;
default:
break;
} }
return 0; return 0;
} }
uint32 GetData(uint32 uiType) uint32 GetData(uint32 type)
{ {
switch(uiType) switch (type)
{ {
case TYPE_BEASTS: return m_auiEncounter[TYPE_BEASTS]; case TYPE_BEASTS:
case TYPE_JARAXXUS: return m_auiEncounter[TYPE_JARAXXUS]; return EncounterStatus[TYPE_BEASTS];
case TYPE_CRUSADERS: return m_auiEncounter[TYPE_CRUSADERS]; case TYPE_JARAXXUS:
case TYPE_VALKIRIES: return m_auiEncounter[TYPE_VALKIRIES]; return EncounterStatus[TYPE_JARAXXUS];
case TYPE_LICH_KING: return m_auiEncounter[TYPE_LICH_KING]; case TYPE_CRUSADERS:
case TYPE_ANUBARAK: return m_auiEncounter[TYPE_ANUBARAK]; return EncounterStatus[TYPE_CRUSADERS];
case TYPE_COUNTER: return m_uiTrialCounter; case TYPE_VALKIRIES:
case TYPE_EVENT: return m_uiEvent; return EncounterStatus[TYPE_VALKIRIES];
case TYPE_NORTHREND_BEASTS: return m_uiNorthrendBeasts; case TYPE_LICH_KING:
case TYPE_EVENT_TIMER: return m_uiEventTimer; return EncounterStatus[TYPE_LICH_KING];
case TYPE_ANUBARAK:
return EncounterStatus[TYPE_ANUBARAK];
case TYPE_COUNTER:
return TrialCounter;
case TYPE_EVENT:
return EventStage;
case TYPE_NORTHREND_BEASTS:
return NorthrendBeasts;
case TYPE_EVENT_TIMER:
return EventTimer;
case TYPE_EVENT_NPC: case TYPE_EVENT_NPC:
switch (m_uiEvent) switch (EventStage)
{ {
case 110: case 110:
case 140: case 140:
@@ -470,7 +552,7 @@ public:
case 6000: case 6000:
case 6005: case 6005:
case 6010: case 6010:
m_uiEventNPCId = NPC_TIRION; EventNPCId = NPC_TIRION;
break; break;
case 5010: case 5010:
case 5030: case 5030:
@@ -479,7 +561,7 @@ public:
case 5060: case 5060:
case 5070: case 5070:
case 5080: case 5080:
m_uiEventNPCId = NPC_LICH_KING_1; EventNPCId = NPC_LICH_KING_1;
break; break;
case 120: case 120:
case 122: case 122:
@@ -488,7 +570,7 @@ public:
case 3051: case 3051:
case 3071: case 3071:
case 4020: case 4020:
m_uiEventNPCId = NPC_VARIAN; EventNPCId = NPC_VARIAN;
break; break;
case 130: case 130:
case 132: case 132:
@@ -497,7 +579,7 @@ public:
case 3070: case 3070:
case 3081: case 3081:
case 4030: case 4030:
m_uiEventNPCId = NPC_GARROSH; EventNPCId = NPC_GARROSH;
break; break;
case 1110: case 1110:
case 1120: case 1120:
@@ -509,32 +591,38 @@ public:
case 1142: case 1142:
case 1144: case 1144:
case 1150: case 1150:
m_uiEventNPCId = NPC_FIZZLEBANG; EventNPCId = NPC_FIZZLEBANG;
break; break;
default: default:
m_uiEventNPCId = NPC_TIRION; EventNPCId = NPC_TIRION;
break; break;
}; };
return m_uiEventNPCId; return EventNPCId;
case DATA_HEALTH_TWIN_SHARED: return m_uiDataDamageTwin; case DATA_HEALTH_TWIN_SHARED:
return DataDamageTwin;
default:
break;
} }
return 0; return 0;
} }
void Update(uint32 uiDiff) void Update(uint32 diff)
{ {
if (GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL && m_uiNotOneButTwoJormungarsTimer) if (GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL && NotOneButTwoJormungarsTimer)
{ {
if (m_uiNotOneButTwoJormungarsTimer <= uiDiff) if (NotOneButTwoJormungarsTimer <= diff)
m_uiNotOneButTwoJormungarsTimer = 0; NotOneButTwoJormungarsTimer = 0;
else m_uiNotOneButTwoJormungarsTimer -= uiDiff; else
NotOneButTwoJormungarsTimer -= diff;
} }
if (GetData(TYPE_CRUSADERS) == IN_PROGRESS && m_uiResilienceWillFixItTimer) if (GetData(TYPE_CRUSADERS) == IN_PROGRESS && ResilienceWillFixItTimer)
{ {
if (m_uiResilienceWillFixItTimer <= uiDiff) if (ResilienceWillFixItTimer <= diff)
m_uiResilienceWillFixItTimer = 0; ResilienceWillFixItTimer = 0;
else m_uiResilienceWillFixItTimer -= uiDiff; else
ResilienceWillFixItTimer -= diff;
} }
} }
@@ -545,19 +633,19 @@ public:
std::ostringstream saveStream; std::ostringstream saveStream;
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
saveStream << m_auiEncounter[i] << " "; saveStream << EncounterStatus[i] << " ";
saveStream << m_uiTrialCounter; saveStream << TrialCounter;
m_strInstData = saveStream.str(); SaveDataBuffer = saveStream.str();
SaveToDB(); SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE; OUT_SAVE_INST_DATA_COMPLETE;
m_bNeedSave = false; NeedSave = false;
} }
std::string GetSaveData() std::string GetSaveData()
{ {
return m_strInstData; return SaveDataBuffer;
} }
void Load(const char* strIn) void Load(const char* strIn)
@@ -574,13 +662,14 @@ public:
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{ {
loadStream >> m_auiEncounter[i]; loadStream >> EncounterStatus[i];
if (m_auiEncounter[i] == IN_PROGRESS) if (EncounterStatus[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED; EncounterStatus[i] = NOT_STARTED;
} }
loadStream >> m_uiTrialCounter;
m_uiEvent = 0; loadStream >> TrialCounter;
EventStage = 0;
OUT_LOAD_INST_DATA_COMPLETE; OUT_LOAD_INST_DATA_COMPLETE;
} }
@@ -591,28 +680,28 @@ public:
{ {
case UPPER_BACK_PAIN_10_PLAYER: case UPPER_BACK_PAIN_10_PLAYER:
case UPPER_BACK_PAIN_10_PLAYER_HEROIC: case UPPER_BACK_PAIN_10_PLAYER_HEROIC:
return m_uiSnoboldCount >= 2; return SnoboldCount >= 2;
case UPPER_BACK_PAIN_25_PLAYER: case UPPER_BACK_PAIN_25_PLAYER:
case UPPER_BACK_PAIN_25_PLAYER_HEROIC: case UPPER_BACK_PAIN_25_PLAYER_HEROIC:
return m_uiSnoboldCount >= 4; return SnoboldCount >= 4;
case THREE_SIXTY_PAIN_SPIKE_10_PLAYER: case THREE_SIXTY_PAIN_SPIKE_10_PLAYER:
case THREE_SIXTY_PAIN_SPIKE_10_PLAYER_HEROIC: case THREE_SIXTY_PAIN_SPIKE_10_PLAYER_HEROIC:
case THREE_SIXTY_PAIN_SPIKE_25_PLAYER: case THREE_SIXTY_PAIN_SPIKE_25_PLAYER:
case THREE_SIXTY_PAIN_SPIKE_25_PLAYER_HEROIC: case THREE_SIXTY_PAIN_SPIKE_25_PLAYER_HEROIC:
return m_uiMistressOfPainCount >= 2; return MistressOfPainCount >= 2;
case A_TRIBUTE_TO_SKILL_10_PLAYER: case A_TRIBUTE_TO_SKILL_10_PLAYER:
case A_TRIBUTE_TO_SKILL_25_PLAYER: case A_TRIBUTE_TO_SKILL_25_PLAYER:
return m_uiTrialCounter >= 25; return TrialCounter >= 25;
case A_TRIBUTE_TO_MAD_SKILL_10_PLAYER: case A_TRIBUTE_TO_MAD_SKILL_10_PLAYER:
case A_TRIBUTE_TO_MAD_SKILL_25_PLAYER: case A_TRIBUTE_TO_MAD_SKILL_25_PLAYER:
return m_uiTrialCounter >= 45; return TrialCounter >= 45;
case A_TRIBUTE_TO_INSANITY_10_PLAYER: case A_TRIBUTE_TO_INSANITY_10_PLAYER:
case A_TRIBUTE_TO_INSANITY_25_PLAYER: case A_TRIBUTE_TO_INSANITY_25_PLAYER:
case REALM_FIRST_GRAND_CRUSADER: case REALM_FIRST_GRAND_CRUSADER:
return m_uiTrialCounter == 50; return TrialCounter == 50;
case A_TRIBUTE_TO_IMMORTALITY_HORDE: case A_TRIBUTE_TO_IMMORTALITY_HORDE:
case A_TRIBUTE_TO_IMMORTALITY_ALLIANCE: case A_TRIBUTE_TO_IMMORTALITY_ALLIANCE:
return m_uiTrialCounter == 50 && m_bTributeToImmortalityElegible; return TrialCounter == 50 && TributeToImmortalityElegible;
case A_TRIBUTE_TO_DEDICATED_INSANITY: case A_TRIBUTE_TO_DEDICATED_INSANITY:
return false/*uiGrandCrusaderAttemptsLeft == 50 && !bHasAtAnyStagePlayerEquippedTooGoodItem*/; return false/*uiGrandCrusaderAttemptsLeft == 50 && !bHasAtAnyStagePlayerEquippedTooGoodItem*/;
} }
@@ -621,9 +710,12 @@ public:
} }
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_trial_of_the_crusader_InstanceMapScript(map);
}
}; };
void AddSC_instance_trial_of_the_crusader() void AddSC_instance_trial_of_the_crusader()
{ {
new instance_trial_of_the_crusader(); new instance_trial_of_the_crusader();
@@ -592,8 +592,8 @@ class npc_tirion_toc : public CreatureScript
case 210: case 210:
if (m_pInstance->GetData(TYPE_BEASTS) != DONE) if (m_pInstance->GetData(TYPE_BEASTS) != DONE)
{ {
me->SummonCreature(NPC_DREADSCALE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS); me->SummonCreature(NPC_DREADSCALE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN);
me->SummonCreature(NPC_ACIDMAW, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS); me->SummonCreature(NPC_ACIDMAW, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN);
if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DREADSCALE))) if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DREADSCALE)))
{ {
pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ());