fix(Scripts/BlackwingLair): Razorgore The Untamed misc improvements (#10205)
- Closes #10151
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1642354321277117900');
|
||||||
|
|
||||||
|
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (19832,19873);
|
||||||
|
INSERT INTO `conditions` VALUES
|
||||||
|
(13,5,19832,0,0,31,0,3,12435,0,0,0,0,'','Possess targets Razorgore the Untamed'),
|
||||||
|
(13,1,19873,0,0,31,0,5,177807,0,0,0,0,'','Destroy Egg targets Razorgore\'s Egg');
|
||||||
@@ -4178,6 +4178,12 @@ void SpellMgr::LoadSpellInfoCorrections()
|
|||||||
spellInfo->Mechanic = 0;
|
spellInfo->Mechanic = 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Calm Dragonkin
|
||||||
|
ApplySpellFix({ 19872 }, [](SpellInfo* spellInfo)
|
||||||
|
{
|
||||||
|
spellInfo->AttributesEx |= SPELL_ATTR1_EXCLUDE_CASTER;
|
||||||
|
});
|
||||||
|
|
||||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||||
{
|
{
|
||||||
SpellInfo* spellInfo = mSpellInfoMap[i];
|
SpellInfo* spellInfo = mSpellInfoMap[i];
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ enum BWLCreatureIds
|
|||||||
NPC_BLACKWING_TASKMASTER = 12458,
|
NPC_BLACKWING_TASKMASTER = 12458,
|
||||||
NPC_BLACKWING_LEGIONAIRE = 12416,
|
NPC_BLACKWING_LEGIONAIRE = 12416,
|
||||||
NPC_BLACKWING_WARLOCK = 12459,
|
NPC_BLACKWING_WARLOCK = 12459,
|
||||||
|
NPC_BLACKWING_MAGE = 12420,
|
||||||
NPC_VAELASTRAZ = 13020,
|
NPC_VAELASTRAZ = 13020,
|
||||||
NPC_BROODLORD = 12017,
|
NPC_BROODLORD = 12017,
|
||||||
NPC_FIREMAW = 11983,
|
NPC_FIREMAW = 11983,
|
||||||
@@ -65,6 +66,7 @@ enum BWLGameObjectIds
|
|||||||
{
|
{
|
||||||
GO_BLACK_DRAGON_EGG = 177807,
|
GO_BLACK_DRAGON_EGG = 177807,
|
||||||
GO_PORTCULLIS_RAZORGORE = 175946,
|
GO_PORTCULLIS_RAZORGORE = 175946,
|
||||||
|
GO_PORTCULLIS_RAZORGORE_ROOM = 176964,
|
||||||
GO_PORTCULLIS_VAELASTRASZ = 175185,
|
GO_PORTCULLIS_VAELASTRASZ = 175185,
|
||||||
GO_PORTCULLIS_BROODLORD = 179365,
|
GO_PORTCULLIS_BROODLORD = 179365,
|
||||||
GO_PORTCULLIS_THREEDRAGONS = 179115,
|
GO_PORTCULLIS_THREEDRAGONS = 179115,
|
||||||
|
|||||||
+45
-14
@@ -31,9 +31,9 @@ enum Say
|
|||||||
|
|
||||||
enum Spells
|
enum Spells
|
||||||
{
|
{
|
||||||
SPELL_MINDCONTROL = 42013,
|
SPELL_MINDCONTROL = 19832,
|
||||||
SPELL_CHANNEL = 45537,
|
|
||||||
SPELL_EGG_DESTROY = 19873,
|
SPELL_EGG_DESTROY = 19873,
|
||||||
|
SPELL_MIND_EXHAUSTION = 23958,
|
||||||
|
|
||||||
SPELL_CLEAVE = 19632,
|
SPELL_CLEAVE = 19632,
|
||||||
SPELL_WARSTOMP = 24375,
|
SPELL_WARSTOMP = 24375,
|
||||||
@@ -73,6 +73,7 @@ public:
|
|||||||
{
|
{
|
||||||
_Reset();
|
_Reset();
|
||||||
|
|
||||||
|
_charmerGUID.Clear();
|
||||||
secondPhase = false;
|
secondPhase = false;
|
||||||
instance->SetData(DATA_EGG_EVENT, NOT_STARTED);
|
instance->SetData(DATA_EGG_EVENT, NOT_STARTED);
|
||||||
}
|
}
|
||||||
@@ -81,35 +82,62 @@ public:
|
|||||||
{
|
{
|
||||||
_JustDied();
|
_JustDied();
|
||||||
Talk(SAY_DEATH);
|
Talk(SAY_DEATH);
|
||||||
|
}
|
||||||
|
|
||||||
instance->SetData(DATA_EGG_EVENT, NOT_STARTED);
|
bool CanAIAttack(Unit const* target) const override
|
||||||
|
{
|
||||||
|
return !(target->GetTypeId() == TYPEID_UNIT && !secondPhase);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoChangePhase()
|
void DoChangePhase()
|
||||||
{
|
{
|
||||||
|
secondPhase = true;
|
||||||
|
_charmerGUID.Clear();
|
||||||
|
me->RemoveAllAuras();
|
||||||
|
me->SetHealth(me->GetMaxHealth());
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
||||||
events.ScheduleEvent(EVENT_STOMP, 35000);
|
events.ScheduleEvent(EVENT_STOMP, 35000);
|
||||||
events.ScheduleEvent(EVENT_FIREBALL, 7000);
|
events.ScheduleEvent(EVENT_FIREBALL, 7000);
|
||||||
events.ScheduleEvent(EVENT_CONFLAGRATION, 12000);
|
events.ScheduleEvent(EVENT_CONFLAGRATION, 12000);
|
||||||
|
}
|
||||||
|
|
||||||
secondPhase = true;
|
void SetGUID(ObjectGuid const guid, int32 /*id*/) override
|
||||||
me->RemoveAllAuras();
|
{
|
||||||
me->SetHealth(me->GetMaxHealth());
|
_charmerGUID = guid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnCharmed(bool apply) override
|
||||||
|
{
|
||||||
|
if (!apply)
|
||||||
|
{
|
||||||
|
if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID))
|
||||||
|
{
|
||||||
|
charmer->CastSpell(charmer, SPELL_MIND_EXHAUSTION, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoAction(int32 action) override
|
void DoAction(int32 action) override
|
||||||
{
|
{
|
||||||
if (action == ACTION_PHASE_TWO)
|
if (action == ACTION_PHASE_TWO)
|
||||||
|
{
|
||||||
DoChangePhase();
|
DoChangePhase();
|
||||||
|
}
|
||||||
|
|
||||||
if (action == TALK_EGG_BROKEN_RAND)
|
if (action == TALK_EGG_BROKEN_RAND)
|
||||||
|
{
|
||||||
Talk(urand(SAY_EGGS_BROKEN1, SAY_EGGS_BROKEN3));
|
Talk(urand(SAY_EGGS_BROKEN1, SAY_EGGS_BROKEN3));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
||||||
{
|
{
|
||||||
if (!secondPhase)
|
if (!secondPhase && damage >= me->GetHealth())
|
||||||
damage = 0;
|
{
|
||||||
|
damage = me->GetHealth() - 1;
|
||||||
|
EnterEvadeMode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
@@ -152,6 +180,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool secondPhase;
|
bool secondPhase;
|
||||||
|
ObjectGuid _charmerGUID;
|
||||||
};
|
};
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
CreatureAI* GetAI(Creature* creature) const override
|
||||||
@@ -168,9 +197,10 @@ public:
|
|||||||
bool OnGossipHello(Player* player, GameObject* go) override
|
bool OnGossipHello(Player* player, GameObject* go) override
|
||||||
{
|
{
|
||||||
if (InstanceScript* instance = go->GetInstanceScript())
|
if (InstanceScript* instance = go->GetInstanceScript())
|
||||||
if (instance->GetData(DATA_EGG_EVENT) != DONE)
|
if (instance->GetData(DATA_EGG_EVENT) != DONE && !player->HasAura(SPELL_MIND_EXHAUSTION))
|
||||||
if (Creature* razor = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_RAZORGORE_THE_UNTAMED)))
|
if (Creature* razor = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_RAZORGORE_THE_UNTAMED)))
|
||||||
{
|
{
|
||||||
|
razor->AI()->SetGUID(player->GetGUID());
|
||||||
razor->Attack(player, true);
|
razor->Attack(player, true);
|
||||||
player->CastSpell(razor, SPELL_MINDCONTROL);
|
player->CastSpell(razor, SPELL_MINDCONTROL);
|
||||||
}
|
}
|
||||||
@@ -193,16 +223,17 @@ public:
|
|||||||
{
|
{
|
||||||
instance->SetData(DATA_EGG_EVENT, SPECIAL);
|
instance->SetData(DATA_EGG_EVENT, SPECIAL);
|
||||||
}
|
}
|
||||||
if (GameObject* egg = GetCaster()->FindNearestGameObject(GO_EGG, 100))
|
|
||||||
{
|
|
||||||
if (!egg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
GetCaster()->GetAI()->DoAction(TALK_EGG_BROKEN_RAND);
|
if (Creature* razorgore = GetCaster()->ToCreature())
|
||||||
|
{
|
||||||
|
if (GameObject* egg = GetHitGObj())
|
||||||
|
{
|
||||||
|
razorgore->AI()->DoAction(TALK_EGG_BROKEN_RAND);
|
||||||
egg->SetLootState(GO_READY);
|
egg->SetLootState(GO_READY);
|
||||||
egg->UseDoorOrButton(10000);
|
egg->UseDoorOrButton(10000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Register() override
|
void Register() override
|
||||||
{
|
{
|
||||||
|
|||||||
+15
-6
@@ -30,6 +30,7 @@
|
|||||||
DoorData const doorData[] =
|
DoorData const doorData[] =
|
||||||
{
|
{
|
||||||
{ GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 175946 || GUID 7230
|
{ GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 175946 || GUID 7230
|
||||||
|
{ GO_PORTCULLIS_RAZORGORE_ROOM, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_ROOM, BOUNDARY_NONE}, // ID 176964 || GUID 75158
|
||||||
{ GO_PORTCULLIS_VAELASTRASZ, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 175185 || GUID 7229
|
{ GO_PORTCULLIS_VAELASTRASZ, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 175185 || GUID 7229
|
||||||
{ GO_PORTCULLIS_BROODLORD, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179365 || GUID 75159
|
{ GO_PORTCULLIS_BROODLORD, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179365 || GUID 75159
|
||||||
{ GO_PORTCULLIS_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165
|
{ GO_PORTCULLIS_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165
|
||||||
@@ -52,7 +53,7 @@ Position const SummonPosition[8] =
|
|||||||
{-7584.175781f, -989.6691289f, 407.199585f, 4.527447f},
|
{-7584.175781f, -989.6691289f, 407.199585f, 4.527447f},
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32 const Entry[5] = {12422, 12458, 12416, 12420, 12459};
|
uint32 const Entry[3] = { 12422, 12416, 12420 };
|
||||||
|
|
||||||
class instance_blackwing_lair : public InstanceMapScript
|
class instance_blackwing_lair : public InstanceMapScript
|
||||||
{
|
{
|
||||||
@@ -92,6 +93,7 @@ public:
|
|||||||
case NPC_BLACKWING_TASKMASTER:
|
case NPC_BLACKWING_TASKMASTER:
|
||||||
case NPC_BLACKWING_LEGIONAIRE:
|
case NPC_BLACKWING_LEGIONAIRE:
|
||||||
case NPC_BLACKWING_WARLOCK:
|
case NPC_BLACKWING_WARLOCK:
|
||||||
|
case NPC_BLACKWING_MAGE:
|
||||||
if (Creature* razor = instance->GetCreature(razorgoreGUID))
|
if (Creature* razor = instance->GetCreature(razorgoreGUID))
|
||||||
if (CreatureAI* razorAI = razor->AI())
|
if (CreatureAI* razorAI = razor->AI())
|
||||||
razorAI->JustSummoned(creature);
|
razorAI->JustSummoned(creature);
|
||||||
@@ -111,7 +113,7 @@ public:
|
|||||||
{
|
{
|
||||||
InstanceScript::OnGameObjectCreate(go);
|
InstanceScript::OnGameObjectCreate(go);
|
||||||
|
|
||||||
switch(go->GetEntry())
|
switch (go->GetEntry())
|
||||||
{
|
{
|
||||||
case GO_BLACK_DRAGON_EGG:
|
case GO_BLACK_DRAGON_EGG:
|
||||||
if (GetBossState(DATA_FIREMAW) == DONE)
|
if (GetBossState(DATA_FIREMAW) == DONE)
|
||||||
@@ -243,15 +245,22 @@ public:
|
|||||||
_events.CancelEvent(EVENT_RAZOR_SPAWN);
|
_events.CancelEvent(EVENT_RAZOR_SPAWN);
|
||||||
EggEvent = data;
|
EggEvent = data;
|
||||||
EggCount = 0;
|
EggCount = 0;
|
||||||
|
for (ObjectGuid const& guid : EggList)
|
||||||
|
{
|
||||||
|
if (GameObject* egg = instance->GetGameObject(guid))
|
||||||
|
{
|
||||||
|
egg->Respawn();
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPECIAL:
|
case SPECIAL:
|
||||||
if (++EggCount == 15)
|
if (++EggCount >= 15)
|
||||||
{
|
{
|
||||||
if (Creature* razor = instance->GetCreature(razorgoreGUID))
|
if (Creature* razor = instance->GetCreature(razorgoreGUID))
|
||||||
{
|
{
|
||||||
SetData(DATA_EGG_EVENT, DONE);
|
SetData(DATA_EGG_EVENT, DONE);
|
||||||
razor->RemoveAurasDueToSpell(42013); // MindControl
|
razor->RemoveAurasDueToSpell(19832); // MindControl
|
||||||
DoRemoveAurasDueToSpellOnPlayers(42013);
|
DoRemoveAurasDueToSpellOnPlayers(19832);
|
||||||
}
|
}
|
||||||
_events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1000);
|
_events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1000);
|
||||||
_events.CancelEvent(EVENT_RAZOR_SPAWN);
|
_events.CancelEvent(EVENT_RAZOR_SPAWN);
|
||||||
@@ -300,7 +309,7 @@ public:
|
|||||||
{
|
{
|
||||||
case EVENT_RAZOR_SPAWN:
|
case EVENT_RAZOR_SPAWN:
|
||||||
for (uint8 i = urand(2, 5); i > 0; --i)
|
for (uint8 i = urand(2, 5); i > 0; --i)
|
||||||
if (Creature* summon = instance->SummonCreature(Entry[urand(0, 4)], SummonPosition[urand(0, 7)]))
|
if (Creature* summon = instance->SummonCreature(Entry[urand(0, 2)], SummonPosition[urand(0, 7)]))
|
||||||
summon->AI()->DoZoneInCombat();
|
summon->AI()->DoZoneInCombat();
|
||||||
_events.ScheduleEvent(EVENT_RAZOR_SPAWN, 12000, 17000);
|
_events.ScheduleEvent(EVENT_RAZOR_SPAWN, 12000, 17000);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user