diff options
6 files changed, 149 insertions, 138 deletions
diff --git a/sql/updates/world/2013_06_26_03_world_creature_template.sql b/sql/updates/world/2013_06_26_03_world_creature_template.sql new file mode 100644 index 00000000000..dae5f5869c3 --- /dev/null +++ b/sql/updates/world/2013_06_26_03_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Missing data for Embeerseer +UPDATE `creature_template` SET `faction_A`=40, `faction_H`=40, `unit_flags`=`unit_flags`|256|33554432 WHERE `entry`=9816; diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h index 020c81a92e1..ccd96ef81d2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h @@ -18,35 +18,35 @@ #ifndef DEF_BLACKROCK_SPIRE_H #define DEF_BLACKROCK_SPIRE_H -uint32 const EncounterCount = 23; +uint32 const EncounterCount = 22; #define BRSScriptName "instance_blackrock_spire" enum DataTypes { - DATA_OMOKK = 1, - DATA_SHADOW_HUNTER_VOSHGAJIN = 2, - DATA_WARMASTER_VOONE = 3, - DATA_MOTHER_SMOLDERWEB = 4, - DATA_UROK_DOOMHOWL = 5, // not scripted - DATA_QUARTERMASTER_ZIGRIS = 6, - DATA_GIZRUL_THE_SLAVENER = 7, // not scripted - DATA_HALYCON = 8, - DATA_OVERLORD_WYRMTHALAK = 9, - DATA_PYROGAURD_EMBERSEER = 10, - DATA_WARCHIEF_REND_BLACKHAND = 11, - DATA_GYTH = 12, - DATA_THE_BEAST = 13, - DATA_GENERAL_DRAKKISATH = 14, + DATA_OMOKK = 0, + DATA_SHADOW_HUNTER_VOSHGAJIN = 1, + DATA_WARMASTER_VOONE = 2, + DATA_MOTHER_SMOLDERWEB = 3, + DATA_UROK_DOOMHOWL = 4, // not scripted + DATA_QUARTERMASTER_ZIGRIS = 5, + DATA_GIZRUL_THE_SLAVENER = 6, // not scripted + DATA_HALYCON = 7, + DATA_OVERLORD_WYRMTHALAK = 8, + DATA_PYROGAURD_EMBERSEER = 9, + DATA_WARCHIEF_REND_BLACKHAND = 10, + DATA_GYTH = 11, + DATA_THE_BEAST = 12, + DATA_GENERAL_DRAKKISATH = 13, // Extra - DATA_DRAGONSPIRE_ROOM = 15, - DATA_HALL_RUNE_1 = 16, - DATA_HALL_RUNE_2 = 17, - DATA_HALL_RUNE_3 = 18, - DATA_HALL_RUNE_4 = 19, - DATA_HALL_RUNE_5 = 20, - DATA_HALL_RUNE_6 = 21, - DATA_HALL_RUNE_7 = 22 + DATA_DRAGONSPIRE_ROOM = 14, + DATA_HALL_RUNE_1 = 15, + DATA_HALL_RUNE_2 = 16, + DATA_HALL_RUNE_3 = 17, + DATA_HALL_RUNE_4 = 18, + DATA_HALL_RUNE_5 = 19, + DATA_HALL_RUNE_6 = 20, + DATA_HALL_RUNE_7 = 21 }; enum CreaturesIds @@ -94,7 +94,6 @@ enum GameObjectsIds GO_GYTH_EXIT_DOOR = 175186, GO_DRAKKISATH_DOOR_1 = 175946, GO_DRAKKISATH_DOOR_2 = 175947, - GO_BLACKROCK_ALTAR = 175706, // Altar used to start Pyroguard Emberseer event // Runes in dragonspire hall GO_HALL_RUNE_1 = 175197, GO_HALL_RUNE_2 = 175199, diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp index e0023995cb3..75e9ad6a140 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp @@ -22,10 +22,10 @@ enum Spells { SPELL_REND_MOUNTS = 16167, // Change model - SPELL_FREEZE = 16350, // Combat - SPELL_KNOCK_AWAY = 10101, // Combat - SPELL_FLAMEBREATH = 16390, // Combat (Self cast) SPELL_CORROSIVE_ACID = 16359, // Combat (self cast) + SPELL_FLAMEBREATH = 16390, // Combat (Self cast) + SPELL_FREEZE = 16350, // Combat (Self cast) + SPELL_KNOCK_AWAY = 10101, // Combat SPELL_SUMMON_REND = 16328 // Summons Rend near death }; @@ -34,7 +34,8 @@ enum Events EVENT_CORROSIVE_ACID = 1, EVENT_FREEZE = 2, EVENT_FLAME_BREATH = 3, - EVENT_SUMMONED = 4, + EVENT_KNOCK_AWAY = 4, + EVENT_SUMMONED = 5, }; class boss_gyth : public CreatureScript @@ -52,15 +53,21 @@ public: { _Reset(); SummonedRend = false; + if (instance->GetBossState(DATA_GYTH) == IN_PROGRESS) + { + instance->SetBossState(DATA_GYTH, DONE); + me->DespawnOrUnsummon(); + } } void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_CORROSIVE_ACID, 18000); - events.ScheduleEvent(EVENT_FREEZE, 20000); - events.ScheduleEvent(EVENT_FLAME_BREATH, 16000); + events.ScheduleEvent(EVENT_CORROSIVE_ACID, urand(8000, 16000)); + events.ScheduleEvent(EVENT_FREEZE, urand(8000, 16000)); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(8000, 16000)); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(12000, 18000)); } void JustDied(Unit* /*killer*/) @@ -80,16 +87,13 @@ public: if (!SummonedRend && HealthBelowPct(5)) { - DoCast(me, SPELL_REND_MOUNTS); + DoCast(me, SPELL_SUMMON_REND); me->RemoveAura(SPELL_REND_MOUNTS); SummonedRend = true; } events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) @@ -99,16 +103,22 @@ public: // Load Path break; case EVENT_CORROSIVE_ACID: - DoCastVictim(SPELL_CORROSIVE_ACID); - events.ScheduleEvent(EVENT_CORROSIVE_ACID, 20000); + DoCast(me, SPELL_CORROSIVE_ACID); + events.ScheduleEvent(EVENT_CORROSIVE_ACID, urand(10000, 16000)); break; case EVENT_FREEZE: - DoCastVictim(SPELL_FREEZE); - events.ScheduleEvent(EVENT_FREEZE, 16000); + DoCast(me, SPELL_FREEZE); + events.ScheduleEvent(EVENT_FREEZE, urand(10000, 16000)); break; case EVENT_FLAME_BREATH: - DoCastVictim(SPELL_FLAMEBREATH); - events.ScheduleEvent(EVENT_FLAME_BREATH, 10000); + DoCast(me, SPELL_FLAMEBREATH); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 16000)); + break; + case EVENT_KNOCK_AWAY: + DoCastVictim(SPELL_KNOCK_AWAY); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(14000, 20000)); + break; + default: break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp index 15fbf90e766..24a1fbad457 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -61,12 +61,11 @@ enum Events EVENT_FIRENOVA = 4, EVENT_FLAMEBUFFET = 5, EVENT_PYROBLAST = 6, - // Reset - EVENT_RESET_ALTAR = 7, // Hack due to trigger spell not in dbc - EVENT_FIRE_SHIELD = 8, + EVENT_FIRE_SHIELD = 7, // Make sure all players have aura from altar - EVENT_PLAYER_CHECK = 9 + EVENT_PLAYER_CHECK = 8, + EVENT_ENTER_COMBAT = 9 }; class boss_pyroguard_emberseer : public CreatureScript @@ -82,46 +81,46 @@ public: { if (instance) { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); - + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + events.Reset(); // Apply auras on spawn and reset // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible - // Open doors on reset - if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS) - OpenDoors(false); // Opens 2 entrance doors - instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED); - + me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH); + me->RemoveAura(SPELL_EMBERSEER_GROWING); + me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER); + events.ScheduleEvent(EVENT_RESPAWN, 1000); // Hack for missing trigger spell events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); - } - } - void JustReachedHome() - { - if (instance) - { - // respawn any dead Blackhand Incarcerators & reset Altar - events.ScheduleEvent(EVENT_RESPAWN, 1000); - events.ScheduleEvent(EVENT_RESET_ALTAR, 6000); + // Open doors on reset + if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS) + OpenDoors(false); // Opens 2 entrance doors } } - void SetData(uint32 type, uint32 data) + void SetData(uint32 /*type*/, uint32 data) { - if (instance && type == 1 && data == 1) - events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000); - - if (instance && type == 1 && data == 2) + switch (data) { - // Close these two doors on Blackhand Incarcerators aggro - if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) - if (door1->GetGoState() == GO_STATE_ACTIVE) - door1->SetGoState(GO_STATE_READY); - if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) - if (door2->GetGoState() == GO_STATE_ACTIVE) - door2->SetGoState(GO_STATE_READY); + case 1: + events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000); + break; + case 2: + // Close these two doors on Blackhand Incarcerators aggro + if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) + if (door1->GetGoState() == GO_STATE_ACTIVE) + door1->SetGoState(GO_STATE_READY); + if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) + if (door2->GetGoState() == GO_STATE_ACTIVE) + door2->SetGoState(GO_STATE_READY); + break; + case 3: + Reset(); + break; + default: + break; } } @@ -138,24 +137,10 @@ public: if (instance) { // Activate all the runes - if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1))) - rune1->SetGoState(GO_STATE_READY); - if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2))) - rune2->SetGoState(GO_STATE_READY); - if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3))) - rune3->SetGoState(GO_STATE_READY); - if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4))) - rune4->SetGoState(GO_STATE_READY); - if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5))) - rune5->SetGoState(GO_STATE_READY); - if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6))) - rune6->SetGoState(GO_STATE_READY); - if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7))) - rune7->SetGoState(GO_STATE_READY); - + UpdateRunes(GO_STATE_READY); // Opens all 3 doors OpenDoors(true); - + // Complete encounter instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE); } } @@ -180,8 +165,8 @@ public: me->CastSpell(me, SPELL_EMBERSEER_FULL_STRENGTH); Talk(EMOTE_FREE_OF_BONDS); Talk(YELL_FREE_OF_BONDS); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE); - AttackStart(me->SelectNearestPlayer(30.0f)); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + events.ScheduleEvent(EVENT_ENTER_COMBAT, 2000); } } } @@ -200,6 +185,28 @@ public: door3->SetGoState(GO_STATE_ACTIVE); } + void UpdateRunes(GOState state) + { + if (instance) + { + // update all runes + if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1))) + rune1->SetGoState(state); + if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2))) + rune2->SetGoState(state); + if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3))) + rune3->SetGoState(state); + if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4))) + rune4->SetGoState(state); + if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5))) + rune5->SetGoState(state); + if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6))) + rune6->SetGoState(state); + if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7))) + rune7->SetGoState(state); + } + } + void UpdateAI(uint32 diff) { events.Update(diff); @@ -215,8 +222,13 @@ public: GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) if (Creature* creatureList = *itr) + { if (!creatureList->IsAlive()) + { creatureList->Respawn(); + } + creatureList->AI()->SetData(1, 2); + } break; } case EVENT_PRE_FIGHT_1: @@ -225,12 +237,10 @@ public: std::list<Creature*> creatureList; GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { if (Creature* creatureList = *itr) creatureList->AI()->SetData(1, 1); - - // Lock Blackrock Altar - if (GameObject* altar = me->GetMap()->GetGameObject(instance->GetData64(GO_BLACKROCK_ALTAR))) - altar->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + } events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000); break; } @@ -239,14 +249,10 @@ public: me->CastSpell(me, SPELL_EMBERSEER_GROWING); Talk(EMOTE_ONE_STACK); break; - case EVENT_RESET_ALTAR: - if (GameObject* altar = me->GetMap()->GetGameObject(instance->GetData64(GO_BLACKROCK_ALTAR))) - altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; case EVENT_FIRE_SHIELD: // #### Spell isn't doing any damage ??? #### - DoCast(SPELL_FIRE_SHIELD); - events.ScheduleEvent(SPELL_FIRE_SHIELD, 3000); + DoCast(me, SPELL_FIRE_SHIELD); + events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); break; case EVENT_PLAYER_CHECK: { @@ -265,30 +271,32 @@ public: } break; } - default: + case EVENT_ENTER_COMBAT: + AttackStart(me->SelectNearestPlayer(30.0f)); break; - } - } - - if (!UpdateVictim()) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { case EVENT_FIRENOVA: - DoCast(me, SPELL_FIRENOVA); + if (UpdateVictim()) + { + DoCast(me, SPELL_FIRENOVA); events.ScheduleEvent(EVENT_FIRENOVA, 6000); + } break; case EVENT_FLAMEBUFFET: - DoCast(me, SPELL_FLAMEBUFFET); + if (UpdateVictim()) + { + DoCast(me, SPELL_FLAMEBUFFET); events.ScheduleEvent(EVENT_FLAMEBUFFET, 14000); + } break; case EVENT_PYROBLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_PYROBLAST); + if (UpdateVictim()) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_PYROBLAST); events.ScheduleEvent(EVENT_PYROBLAST, 15000); + } + break; + default: break; } } @@ -327,7 +335,8 @@ public: void Reset() { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000); + if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) + Emberseer->AI()->SetData(1, 3); } void JustDied(Unit* /*killer*/) @@ -343,6 +352,11 @@ public: me->InterruptSpell(CURRENT_CHANNELED_SPELL); _events.CancelEvent(EVENT_ENCAGED_EMBERSEER); } + + if (data == 1 && value == 2) + { + _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 5000); + } } void EnterCombat(Unit* /*who*/) @@ -350,9 +364,10 @@ public: // Used to close doors if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) Emberseer->AI()->SetData(1, 2); - + me->CallForHelp(60.0f); _events.ScheduleEvent(EVENT_STRIKE, urand(8000, 16000)); _events.ScheduleEvent(EVENT_ENCAGE, urand(10000, 20000)); + me->CallForHelp(60.0f); // double call because not all are aggroing on first call. } void UpdateAI(uint32 diff) @@ -370,7 +385,6 @@ public: if(!me->HasAura(SPELL_ENCAGE_EMBERSEER)) if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) DoCast(Emberseer, SPELL_ENCAGE_EMBERSEER); - _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 5000); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp index 6eff7f7a430..7b80f75255a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp @@ -66,16 +66,6 @@ public: go_blackrockaltar = 0; } - bool IsEncounterInProgress() const - { - for (uint8 i = 0; i < EncounterCount; ++i) - { - if (encounter[i] == IN_PROGRESS) - return true; - } - return false; - } - void OnCreatureCreate(Creature* creature) { switch (creature->GetEntry()) @@ -153,11 +143,6 @@ public: if (GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE) HandleGameObject(0, true, go); break; - case GO_BLACKROCK_ALTAR: - go_blackrockaltar = go->GetGUID(); - if (GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; case GO_HALL_RUNE_1: go_roomrunes[0] = go->GetGUID(); if (GetBossState(DATA_HALL_RUNE_1) == DONE) @@ -347,9 +332,6 @@ public: case GO_EMBERSEER_OUT: return go_emberseerout; break; - case GO_BLACKROCK_ALTAR: - return go_blackrockaltar; - break; case GO_HALL_RUNE_1: return go_roomrunes[0]; break; @@ -544,8 +526,11 @@ public: loadStream >> tmpState; if (tmpState == IN_PROGRESS || tmpState > SPECIAL) tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); } } + else + OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_COMPLETE; } diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp index d8be67777e4..fde21c63840 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp @@ -64,6 +64,7 @@ enum Says enum Gossip { GOSSIP_ID = 21332, + GOSSIP_OPTION_ID = 0 }; enum Creatures @@ -269,7 +270,7 @@ public: void sGossipSelect(Player* player, uint32 sender, uint32 action) { - if (sender == GOSSIP_ID && action == 0) + if (sender == GOSSIP_ID && action == GOSSIP_OPTION_ID) { player->CLOSE_GOSSIP_MENU(); Talk(SAY_GAMESBEGIN_1); |