aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-01-30 17:44:19 +0100
committerShauren <shauren.trinity@gmail.com>2011-01-30 17:44:19 +0100
commit13d2ad9abe46a1a6c18e17011aaeb2346b1bfc6a (patch)
tree0d41228f537acd039bfa356d03c71d9b3bd5ec93
parent6668b6155859db1944442a46759fe5ae54cd592b (diff)
Scripts/Icecrown Citadel: Fixed encounter state after wipe on Blood Prince Council (prevent exploits), also fixed Dark Nucleus spawning out of the room
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp65
1 files changed, 52 insertions, 13 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index da9ec2380d0..ca6112ad889 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -195,12 +195,16 @@ class boss_blood_council_controller : public CreatureScript
events.Reset();
me->SetReactState(REACT_PASSIVE);
invocationStage = 0;
+ resetCounter = 0;
instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
+ if (instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == IN_PROGRESS)
+ return;
+
if (!instance->CheckRequiredBosses(DATA_BLOOD_PRINCE_COUNCIL, who->ToPlayer()))
{
EnterEvadeMode();
@@ -215,22 +219,19 @@ class boss_blood_council_controller : public CreatureScript
if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID)))
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, keleseth);
- if (!keleseth->isInCombat())
- DoZoneInCombat(keleseth);
+ DoZoneInCombat(keleseth);
}
if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID)))
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, taldaram);
- if (!taldaram->isInCombat())
- DoZoneInCombat(taldaram);
+ DoZoneInCombat(taldaram);
}
if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID)))
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, valanar);
- if (!valanar->isInCombat())
- DoZoneInCombat(valanar);
+ DoZoneInCombat(valanar);
}
events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46500);
@@ -267,9 +268,24 @@ class boss_blood_council_controller : public CreatureScript
}
}
+ void SetData(uint32 /*type*/, uint32 data)
+ {
+ resetCounter += data;
+ if (resetCounter == 3)
+ EnterEvadeMode();
+ }
+
void JustReachedHome()
{
- instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, FAIL);
+ resetCounter = 0;
+ if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID)))
+ keleseth->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID)))
+ taldaram->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID)))
+ valanar->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void JustDied(Unit* /*killer*/)
@@ -350,6 +366,7 @@ class boss_blood_council_controller : public CreatureScript
InvocationData() : guid(0), spellId(0), textId(0), visualSpell(0) { }
} invocationOrder[3];
uint8 invocationStage;
+ uint8 resetCounter;
};
CreatureAI* GetAI(Creature* creature) const
@@ -406,8 +423,7 @@ class boss_prince_keleseth_icc : public CreatureScript
void EnterCombat(Unit* /*who*/)
{
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
- if (!controller->isInCombat())
- DoZoneInCombat(controller);
+ DoZoneInCombat(controller);
events.ScheduleEvent(EVENT_BERSERK, 600000);
events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000));
@@ -425,6 +441,11 @@ class boss_prince_keleseth_icc : public CreatureScript
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(spawnHealth);
isEmpowered = false;
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ controller->AI()->SetData(0, 1);
+ }
}
void JustRespawned()
@@ -442,6 +463,13 @@ class boss_prince_keleseth_icc : public CreatureScript
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
+ // prevent spawning outside of room
+ if (summon->GetExactDist2d(&roomCenter) > 50.0f)
+ {
+ Position pos;
+ pos.Relocate(roomCenter);
+ summon->MovePosition(pos, rand_norm() * 50.0f, summon->GetAngle(&roomCenter));
+ }
}
void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType)
@@ -535,6 +563,7 @@ class boss_prince_keleseth_icc : public CreatureScript
}
private:
+ static const Position roomCenter;
bool isEmpowered; // bool check faster than map lookup
uint32 spawnHealth;
};
@@ -545,6 +574,8 @@ class boss_prince_keleseth_icc : public CreatureScript
}
};
+const Position boss_prince_keleseth_icc::boss_prince_kelesethAI::roomCenter = {4658.0f, 2769.26f, 361.2f, 0.0f};
+
class boss_prince_taldaram_icc : public CreatureScript
{
public:
@@ -593,8 +624,7 @@ class boss_prince_taldaram_icc : public CreatureScript
void EnterCombat(Unit* /*who*/)
{
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
- if (!controller->isInCombat())
- DoZoneInCombat(controller);
+ DoZoneInCombat(controller);
events.ScheduleEvent(EVENT_BERSERK, 600000);
events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(12000,15000));
@@ -612,6 +642,11 @@ class boss_prince_taldaram_icc : public CreatureScript
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(spawnHealth);
isEmpowered = false;
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ controller->AI()->SetData(0, 1);
+ }
}
void JustRespawned()
@@ -794,8 +829,7 @@ class boss_prince_valanar_icc : public CreatureScript
void EnterCombat(Unit* /*who*/)
{
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
- if (!controller->isInCombat())
- DoZoneInCombat(controller);
+ DoZoneInCombat(controller);
events.ScheduleEvent(EVENT_BERSERK, 600000);
events.ScheduleEvent(EVENT_KINETIC_BOMB, urand(18000, 24000));
@@ -813,6 +847,11 @@ class boss_prince_valanar_icc : public CreatureScript
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(me->GetMaxHealth());
isEmpowered = false;
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ controller->AI()->SetData(0, 1);
+ }
}
void JustRespawned()