diff --git a/data/sql/updates/pending_db_world/rev_1642354321277117900.sql b/data/sql/updates/pending_db_world/rev_1642354321277117900.sql new file mode 100644 index 000000000..7df06c5b9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1642354321277117900.sql @@ -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'); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 878038f38..9ccc07cf9 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4178,6 +4178,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Mechanic = 0; }); + // Calm Dragonkin + ApplySpellFix({ 19872 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx |= SPELL_ATTR1_EXCLUDE_CASTER; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index d6706482b..dfa112fe1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -51,6 +51,7 @@ enum BWLCreatureIds NPC_BLACKWING_TASKMASTER = 12458, NPC_BLACKWING_LEGIONAIRE = 12416, NPC_BLACKWING_WARLOCK = 12459, + NPC_BLACKWING_MAGE = 12420, NPC_VAELASTRAZ = 13020, NPC_BROODLORD = 12017, NPC_FIREMAW = 11983, @@ -63,15 +64,16 @@ enum BWLCreatureIds enum BWLGameObjectIds { - GO_BLACK_DRAGON_EGG = 177807, - GO_PORTCULLIS_RAZORGORE = 175946, - GO_PORTCULLIS_VAELASTRASZ = 175185, - GO_PORTCULLIS_BROODLORD = 179365, - GO_PORTCULLIS_THREEDRAGONS = 179115, - GO_CHROMAGGUS_LEVER = 179148, - GO_PORTCULLIS_CHROMAGGUS = 179116, - GO_PORTCULLIS_NEFARIAN = 179117, - GO_SUPPRESSION_DEVICE = 179784 + GO_BLACK_DRAGON_EGG = 177807, + GO_PORTCULLIS_RAZORGORE = 175946, + GO_PORTCULLIS_RAZORGORE_ROOM = 176964, + GO_PORTCULLIS_VAELASTRASZ = 175185, + GO_PORTCULLIS_BROODLORD = 179365, + GO_PORTCULLIS_THREEDRAGONS = 179115, + GO_CHROMAGGUS_LEVER = 179148, + GO_PORTCULLIS_CHROMAGGUS = 179116, + GO_PORTCULLIS_NEFARIAN = 179117, + GO_SUPPRESSION_DEVICE = 179784 }; enum BWLEvents diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index b37ed9857..2ab735e75 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -31,9 +31,9 @@ enum Say enum Spells { - SPELL_MINDCONTROL = 42013, - SPELL_CHANNEL = 45537, + SPELL_MINDCONTROL = 19832, SPELL_EGG_DESTROY = 19873, + SPELL_MIND_EXHAUSTION = 23958, SPELL_CLEAVE = 19632, SPELL_WARSTOMP = 24375, @@ -73,6 +73,7 @@ public: { _Reset(); + _charmerGUID.Clear(); secondPhase = false; instance->SetData(DATA_EGG_EVENT, NOT_STARTED); } @@ -81,35 +82,62 @@ public: { _JustDied(); 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() { + secondPhase = true; + _charmerGUID.Clear(); + me->RemoveAllAuras(); + me->SetHealth(me->GetMaxHealth()); + events.ScheduleEvent(EVENT_CLEAVE, 15000); events.ScheduleEvent(EVENT_STOMP, 35000); events.ScheduleEvent(EVENT_FIREBALL, 7000); events.ScheduleEvent(EVENT_CONFLAGRATION, 12000); + } - secondPhase = true; - me->RemoveAllAuras(); - me->SetHealth(me->GetMaxHealth()); + void SetGUID(ObjectGuid const guid, int32 /*id*/) override + { + _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 { if (action == ACTION_PHASE_TWO) + { DoChangePhase(); + } if (action == TALK_EGG_BROKEN_RAND) + { Talk(urand(SAY_EGGS_BROKEN1, SAY_EGGS_BROKEN3)); + } } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { - if (!secondPhase) - damage = 0; + if (!secondPhase && damage >= me->GetHealth()) + { + damage = me->GetHealth() - 1; + EnterEvadeMode(); + } } void UpdateAI(uint32 diff) override @@ -152,6 +180,7 @@ public: private: bool secondPhase; + ObjectGuid _charmerGUID; }; CreatureAI* GetAI(Creature* creature) const override @@ -168,9 +197,10 @@ public: bool OnGossipHello(Player* player, GameObject* go) override { 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))) { + razor->AI()->SetGUID(player->GetGUID()); razor->Attack(player, true); player->CastSpell(razor, SPELL_MINDCONTROL); } @@ -193,15 +223,16 @@ public: { 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->UseDoorOrButton(10000); } + } } void Register() override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index aa64c712f..56df2d0e3 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -29,15 +29,16 @@ DoorData const doorData[] = { - { GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 175946 || GUID 7230 - { 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_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165 - { GO_PORTCULLIS_THREEDRAGONS, DATA_EBONROC, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165 - { GO_PORTCULLIS_THREEDRAGONS, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165 - { GO_PORTCULLIS_CHROMAGGUS, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179116 || GUID 75161 - { GO_PORTCULLIS_NEFARIAN, DATA_NEFARIAN, DOOR_TYPE_ROOM, BOUNDARY_NONE}, // ID 179117 || GUID 75164 - { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END + { 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_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_EBONROC, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165 + { GO_PORTCULLIS_THREEDRAGONS, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179115 || GUID 75165 + { GO_PORTCULLIS_CHROMAGGUS, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, // ID 179116 || GUID 75161 + { GO_PORTCULLIS_NEFARIAN, DATA_NEFARIAN, DOOR_TYPE_ROOM, BOUNDARY_NONE}, // ID 179117 || GUID 75164 + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END }; Position const SummonPosition[8] = @@ -52,7 +53,7 @@ Position const SummonPosition[8] = {-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 { @@ -92,6 +93,7 @@ public: case NPC_BLACKWING_TASKMASTER: case NPC_BLACKWING_LEGIONAIRE: case NPC_BLACKWING_WARLOCK: + case NPC_BLACKWING_MAGE: if (Creature* razor = instance->GetCreature(razorgoreGUID)) if (CreatureAI* razorAI = razor->AI()) razorAI->JustSummoned(creature); @@ -111,7 +113,7 @@ public: { InstanceScript::OnGameObjectCreate(go); - switch(go->GetEntry()) + switch (go->GetEntry()) { case GO_BLACK_DRAGON_EGG: if (GetBossState(DATA_FIREMAW) == DONE) @@ -243,15 +245,22 @@ public: _events.CancelEvent(EVENT_RAZOR_SPAWN); EggEvent = data; EggCount = 0; + for (ObjectGuid const& guid : EggList) + { + if (GameObject* egg = instance->GetGameObject(guid)) + { + egg->Respawn(); + } + } break; case SPECIAL: - if (++EggCount == 15) + if (++EggCount >= 15) { if (Creature* razor = instance->GetCreature(razorgoreGUID)) { SetData(DATA_EGG_EVENT, DONE); - razor->RemoveAurasDueToSpell(42013); // MindControl - DoRemoveAurasDueToSpellOnPlayers(42013); + razor->RemoveAurasDueToSpell(19832); // MindControl + DoRemoveAurasDueToSpellOnPlayers(19832); } _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1000); _events.CancelEvent(EVENT_RAZOR_SPAWN); @@ -300,7 +309,7 @@ public: { case EVENT_RAZOR_SPAWN: 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(); _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 12000, 17000); break;