diff --git a/data/sql/updates/db_world/0000_00_00_00.sql b/data/sql/updates/db_world/0000_00_00_00.sql index ed89531b47..48284abcab 100644 --- a/data/sql/updates/db_world/0000_00_00_00.sql +++ b/data/sql/updates/db_world/0000_00_00_00.sql @@ -290,3 +290,5 @@ INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (@SHADOWFLAME -- attaching lever script to gob UPDATE `gameobject_template` SET `ScriptName`='go_chromaggus_lever' WHERE `entry`=179148; + +DELETE FROM `gameobject` WHERE `guid` IN(75160,75163,7228,7227,); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index ef0b1de625..b50a727f3d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -53,14 +53,13 @@ enum BWLCreatureIds enum BWLGameObjectIds { GO_BLACK_DRAGON_EGG = 177807, - GO_PORTCULLIS_RAZORGORE = 176965, - GO_PORTCULLIS_VAELASTRASZ = 179364, + GO_PORTCULLIS_RAZORGORE = 175946, + GO_PORTCULLIS_VAELASTRASZ = 175185, GO_PORTCULLIS_BROODLORD = 179365, GO_PORTCULLIS_THREEDRAGONS = 179115, - GO_PORTCULLIS_CHROMAGGUS = 179117, //Door after you kill him, not the one for his room GO_CHROMAGGUS_LEVER = 179148, - GO_CHROMAGGUS_DOOR = 179116, - GO_PORTCULLIS_NEFARIAN = 176966, + GO_PORTCULLIS_CHROMAGGUS = 179116, + GO_PORTCULLIS_NEFARIAN = 179117, GO_SUPPRESSION_DEVICE = 179784 }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 67b03062f1..5fc32e5d3e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -8,7 +8,11 @@ #include "ScriptedGossip.h" #include "ScriptedCreature.h" #include "blackwing_lair.h" +#include "GameObject.h" +#include "InstanceScript.h" +#include "MotionMaster.h" #include "Player.h" +#include "TemporarySummon.h" enum Events { @@ -154,28 +158,26 @@ public: struct boss_victor_nefariusAI : public BossAI { - boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { } + boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) + { + Initialize(); + } - void Reset() + void Initialize() { SpawnedAdds = 0; + } + + void Reset() override + { + Initialize(); if (me->GetMapId() == 469) { - // pussywizard: - bool reset = true; - if (instance) - if (/*Creature* nefarian = */instance->instance->GetCreature(instance->GetData64(DATA_NEFARIAN))) - reset = false; - if (reset) + if (!me->FindNearestCreature(NPC_NEFARIAN, 1000.0f, true)) _Reset(); - // pussywizard: - if (!instance || instance->GetBossState(DATA_NEFARIAN) == DONE || instance->GetBossState(DATA_NEFARIAN) == IN_PROGRESS) - me->SetVisible(false); - else - me->SetVisible(true); - + me->SetVisible(true); me->SetPhaseMask(1, true); me->SetUInt32Value(UNIT_NPC_FLAGS, 1); me->setFaction(35); @@ -184,9 +186,7 @@ public: } } - bool CanAIAttack(const Unit* /*target*/) const { return me->IsVisible(); } - - void JustReachedHome() + void JustReachedHome() override { Reset(); } @@ -200,15 +200,16 @@ public: me->setFaction(103); me->SetUInt32Value(UNIT_NPC_FLAGS, 0); DoCast(me, SPELL_NEFARIANS_BARRIER); - me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); AttackStart(target); - events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(3000, 10000)); - events.ScheduleEvent(EVENT_FEAR, urand(10000, 20000)); - //events.ScheduleEvent(EVENT_MIND_CONTROL, urand(30000, 35000)); - events.ScheduleEvent(EVENT_SPAWN_ADD, 10000); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 3, 10); + events.ScheduleEvent(EVENT_FEAR, 10, 20); + //events.ScheduleEvent(EVENT_MIND_CONTROL, 30, 35); + events.ScheduleEvent(EVENT_SPAWN_ADD, 10); } - void SummonedCreatureDies(Creature* summon, Unit*) + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override { if (summon->GetEntry() != NPC_NEFARIAN) { @@ -219,21 +220,21 @@ public: } } - void JustSummoned(Creature* /*summon*/) { } + void JustSummoned(Creature* /*summon*/) override { } - void SetData(uint32 type, uint32 data) + void SetData(uint32 type, uint32 data) override { if ( type == 1 && data == 1) { me->StopMoving(); - events.ScheduleEvent(EVENT_PATH_2, 9000); + events.ScheduleEvent(EVENT_PATH_2, 9); } if (type == 1 && data == 2) - events.ScheduleEvent(EVENT_SUCCESS_1, 5000); + events.ScheduleEvent(EVENT_SUCCESS_1, 5); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) { @@ -245,7 +246,7 @@ public: { case EVENT_PATH_2: me->GetMotionMaster()->MovePath(NEFARIUS_PATH_2, false); - events.ScheduleEvent(EVENT_CHAOS_1, 7000); + events.ScheduleEvent(EVENT_CHAOS_1, 7); break; case EVENT_CHAOS_1: if (Creature* gyth = me->FindNearestCreature(NPC_GYTH, 75.0f, true)) @@ -253,7 +254,7 @@ public: me->SetFacingToObject(gyth); Talk(SAY_CHAOS_SPELL); } - events.ScheduleEvent(EVENT_CHAOS_2, 2000); + events.ScheduleEvent(EVENT_CHAOS_2, 2); break; case EVENT_CHAOS_2: DoCast(SPELL_CHROMATIC_CHAOS); @@ -262,10 +263,10 @@ public: case EVENT_SUCCESS_1: if (Unit* player = me->SelectNearestPlayer(60.0f)) { - me->SetInFront(player); - Talk(SAY_SUCCESS); + me->SetFacingToObject(player); + Talk(SAY_SUCCESS); if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f)) - portcullis1->SetGoState(GO_STATE_ACTIVE); + portcullis1->SetGoState(GO_STATE_ACTIVE); if (GameObject* portcullis2 = me->FindNearestGameObject(GO_PORTCULLIS_TOBOSSROOMS, 80.0f)) portcullis2->SetGoState(GO_STATE_ACTIVE); } @@ -309,20 +310,20 @@ public: break; } DoResetThreat(); - events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(3000, 10000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 3, 10); break; case EVENT_FEAR: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) DoCast(target, SPELL_FEAR); - events.ScheduleEvent(EVENT_FEAR, urand(10000, 20000)); + events.ScheduleEvent(EVENT_FEAR, 10, 20); break; case EVENT_MIND_CONTROL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) DoCast(target, SPELL_SHADOW_COMMAND); - events.ScheduleEvent(EVENT_MIND_CONTROL, urand(30000, 35000)); + events.ScheduleEvent(EVENT_MIND_CONTROL, 30, 35); break; case EVENT_SPAWN_ADD: - for (uint8 i = 0; i < 2; ++i) + for (uint8 i=0; i<2; ++i) { uint32 CreatureID; if (urand(0, 2) == 0) @@ -339,50 +340,45 @@ public: { if (Creature* nefarian = me->SummonCreature(NPC_NEFARIAN, NefarianLoc[0])) { - nefarian->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); + nefarian->setActive(true); nefarian->SetCanFly(true); - nefarian->SetHover(false); - nefarian->setActive(true); - nefarian->SetHomePosition(NefarianLoc[1]); - nefarian->GetMotionMaster()->MoveCharge(NefarianLoc[1].GetPositionX(), NefarianLoc[1].GetPositionY(), NefarianLoc[1].GetPositionZ(), 15.0f); - - nefarian->AI()->DoCastAOE(SPELL_SHADOWFLAME_INITIAL); + nefarian->SetDisableGravity(true); + nefarian->CastSpell(nullptr, SPELL_SHADOWFLAME_INITIAL); + nefarian->GetMotionMaster()->MovePoint(1, NefarianLoc[1]); } events.CancelEvent(EVENT_MIND_CONTROL); events.CancelEvent(EVENT_FEAR); events.CancelEvent(EVENT_SHADOW_BOLT); me->SetVisible(false); - EnterEvadeMode(); return; } } - events.ScheduleEvent(EVENT_SPAWN_ADD, 4000); + events.ScheduleEvent(EVENT_SPAWN_ADD, 4); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } } } - void sGossipSelect(Player* player, uint32 sender, uint32 action) + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { - if (sender == GOSSIP_ID && action == GOSSIP_OPTION_ID) + if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { - // pussywizard: - InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_NEFARIAN) == DONE) - return; - CloseGossipMenuFor(player); Talk(SAY_GAMESBEGIN_1); BeginEvent(player); } + return false; } - private: - uint32 SpawnedAdds; + private: + uint32 SpawnedAdds; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } @@ -395,59 +391,67 @@ public: struct boss_nefarianAI : public BossAI { - boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { } + boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) + { + Initialize(); + } - void Reset() + void Initialize() { Phase3 = false; canDespawn = false; DespawnTimer = 30000; } - void JustReachedHome() + void Reset() override + { + Initialize(); + } + + void JustReachedHome() override { canDespawn = true; } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* /*who*/) override { - events.ScheduleEvent(EVENT_SHADOWFLAME, 12000); - events.ScheduleEvent(EVENT_FEAR, urand(25000, 35000)); - events.ScheduleEvent(EVENT_VEILOFSHADOW, urand(25000, 35000)); - events.ScheduleEvent(EVENT_CLEAVE, 7000); - //events.ScheduleEvent(EVENT_TAILLASH, 10000); - events.ScheduleEvent(EVENT_CLASSCALL, urand(30000, 35000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 12); + events.ScheduleEvent(EVENT_FEAR, 25, 35); + events.ScheduleEvent(EVENT_VEILOFSHADOW, 25, 35); + events.ScheduleEvent(EVENT_CLEAVE, 7); + //events.ScheduleEvent(EVENT_TAILLASH, 10); + events.ScheduleEvent(EVENT_CLASSCALL, 30, 35); Talk(SAY_RANDOM); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) override { _JustDied(); Talk(SAY_DEATH); } - void KilledUnit(Unit* victim) + void KilledUnit(Unit* victim) override { - if (rand() % 5) + if (rand32() % 5) return; Talk(SAY_SLAY, victim); } - void MovementInform(uint32 type, uint32 /*id*/) + void MovementInform(uint32 type, uint32 id) override { if (type != POINT_MOTION_TYPE) return; - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetWalk(false); - me->SetInCombatWithZone(); - if (me->GetVictim()) - AttackStart(me->GetVictim()); + if (id == 1) + { + DoZoneInCombat(); + if (me->GetVictim()) + AttackStart(me->GetVictim()); + } } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (canDespawn && DespawnTimer <= diff) { @@ -458,8 +462,7 @@ public: for (std::list::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) (*itr)->DespawnOrUnsummon(); - } - else DespawnTimer -= diff; + } else DespawnTimer -= diff; if (!UpdateVictim()) return; @@ -478,75 +481,78 @@ public: { case EVENT_SHADOWFLAME: DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, 12000); + events.ScheduleEvent(EVENT_SHADOWFLAME, 12); break; case EVENT_FEAR: DoCastVictim(SPELL_BELLOWINGROAR); - events.ScheduleEvent(EVENT_FEAR, urand(25000, 35000)); + events.ScheduleEvent(EVENT_FEAR, 25, 35); break; case EVENT_VEILOFSHADOW: DoCastVictim(SPELL_VEILOFSHADOW); - events.ScheduleEvent(EVENT_VEILOFSHADOW, urand(25000, 35000)); + events.ScheduleEvent(EVENT_VEILOFSHADOW, 25, 35); break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 7000); + events.ScheduleEvent(EVENT_CLEAVE, 7); break; case EVENT_TAILLASH: // Cast NYI since we need a better check for behind target DoCastVictim(SPELL_TAILLASH); - events.ScheduleEvent(EVENT_TAILLASH, 10000); + events.ScheduleEvent(EVENT_TAILLASH, 10); break; case EVENT_CLASSCALL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) switch (target->getClass()) - { - case CLASS_MAGE: - Talk(SAY_MAGE); - DoCast(me, SPELL_MAGE); - break; - case CLASS_WARRIOR: - Talk(SAY_WARRIOR); - DoCast(me, SPELL_WARRIOR); - break; - case CLASS_DRUID: - Talk(SAY_DRUID); - DoCast(target, SPELL_DRUID); - break; - case CLASS_PRIEST: - Talk(SAY_PRIEST); - DoCast(me, SPELL_PRIEST); - break; - case CLASS_PALADIN: - Talk(SAY_PALADIN); - DoCast(me, SPELL_PALADIN); - break; - case CLASS_SHAMAN: - Talk(SAY_SHAMAN); - DoCast(me, SPELL_SHAMAN); - break; - case CLASS_WARLOCK: - Talk(SAY_WARLOCK); - DoCast(me, SPELL_WARLOCK); - break; - case CLASS_HUNTER: - Talk(SAY_HUNTER); - DoCast(me, SPELL_HUNTER); - break; - case CLASS_ROGUE: - Talk(SAY_ROGUE); - DoCast(me, SPELL_ROGUE); - break; - case CLASS_DEATH_KNIGHT: - Talk(SAY_DEATH_KNIGHT); - DoCast(me, SPELL_DEATH_KNIGHT); - break; - default: - break; - } - events.ScheduleEvent(EVENT_CLASSCALL, urand(30000, 35000)); + { + case CLASS_MAGE: + Talk(SAY_MAGE); + DoCast(me, SPELL_MAGE); + break; + case CLASS_WARRIOR: + Talk(SAY_WARRIOR); + DoCast(me, SPELL_WARRIOR); + break; + case CLASS_DRUID: + Talk(SAY_DRUID); + DoCast(target, SPELL_DRUID); + break; + case CLASS_PRIEST: + Talk(SAY_PRIEST); + DoCast(me, SPELL_PRIEST); + break; + case CLASS_PALADIN: + Talk(SAY_PALADIN); + DoCast(me, SPELL_PALADIN); + break; + case CLASS_SHAMAN: + Talk(SAY_SHAMAN); + DoCast(me, SPELL_SHAMAN); + break; + case CLASS_WARLOCK: + Talk(SAY_WARLOCK); + DoCast(me, SPELL_WARLOCK); + break; + case CLASS_HUNTER: + Talk(SAY_HUNTER); + DoCast(me, SPELL_HUNTER); + break; + case CLASS_ROGUE: + Talk(SAY_ROGUE); + DoCast(me, SPELL_ROGUE); + break; + case CLASS_DEATH_KNIGHT: + Talk(SAY_DEATH_KNIGHT); + DoCast(me, SPELL_DEATH_KNIGHT); + break; + default: + break; + } + events.ScheduleEvent(EVENT_CLASSCALL, 30, 35); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } // Phase3 begins when health below 20 pct @@ -558,7 +564,7 @@ public: if ((*itr) && !(*itr)->IsAlive()) { (*itr)->Respawn(); - (*itr)->SetInCombatWithZone(); + DoZoneInCombat((*itr)); (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); (*itr)->SetReactState(REACT_AGGRESSIVE); (*itr)->SetStandState(UNIT_STAND_STATE_STAND); 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 81e6083220..aa1be8439b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -16,15 +16,15 @@ DoorData const doorData[] = { - { GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_VAELASTRASZ, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_BROODLORD, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_THREEDRAGONS, DATA_EBONROC, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_THREEDRAGONS, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_CHROMAGGUS, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE }, - { GO_PORTCULLIS_NEFARIAN, DATA_NEFARIAN, DOOR_TYPE_ROOM }, - { 0, 0, DOOR_TYPE_ROOM } // END + { GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE }, // ID 175946 || GUID 7230 + { GO_PORTCULLIS_VAELASTRASZ, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE }, // ID 175185 || GUID 7229 + { GO_PORTCULLIS_BROODLORD, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE }, // ID 179365 || GUID 75159 + { GO_PORTCULLIS_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE }, // ID 179115 || GUID 75165 + { GO_PORTCULLIS_THREEDRAGONS, DATA_EBONROC, DOOR_TYPE_PASSAGE }, // ID 179115 || GUID 75165 + { GO_PORTCULLIS_THREEDRAGONS, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE }, // ID 179115 || GUID 75165 + { GO_PORTCULLIS_CHROMAGGUS, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE }, // ID 179116 || GUID 75161 + { GO_PORTCULLIS_NEFARIAN, DATA_NEFARIAN, DOOR_TYPE_ROOM }, // ID 179117 || GUID 75164 + { 0, 0, DOOR_TYPE_ROOM } // END }; uint64 const creatureData[10][2] = @@ -39,13 +39,7 @@ uint64 const creatureData[10][2] = { NPC_NEFARIAN, DATA_NEFARIAN }, { NPC_VICTOR_NEFARIUS, DATA_LORD_VICTOR_NEFARIUS }, { 0, 0 } // END -}; - -uint64 const gameObjectData[2][2] = -{ - { GO_CHROMAGGUS_DOOR, DATA_GO_CHROMAGGUS_DOOR }, - { 0, 0 } //END -}; +}; Position const SummonPosition[8] = {