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