From 2743874e5da893c18f6ae19f88dcf944cf4cfc8b Mon Sep 17 00:00:00 2001 From: lineagedr Date: Wed, 27 May 2020 22:58:28 +0300 Subject: [PATCH] fix(Core/Script): Trial of the Crusader (#2888) * The floor will remain broken after a wipe * Anub'arak will respawn correctly after wiping --- .../instance_trial_of_the_crusader.cpp | 95 +++++++++++-------- .../trial_of_the_crusader.h | 1 + 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index beb13db48..61f05b5aa 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -59,6 +59,40 @@ public: uint64 GO_WebDoorGUID; uint64 GO_FloorGUID; + void SpawnAnubArak() + { + if (InstanceProgress == INSTANCE_PROGRESS_ANUB_ARAK) + { + if (Creature* barrett = instance->GetCreature(NPC_BarrettGUID)) + { + barrett->SetVisible(false); + if (AttemptsLeft) + if (!ObjectAccessor::GetCreature(*barrett, NPC_AnubarakGUID)) + barrett->SummonCreature(NPC_ANUBARAK, Locs[LOC_ANUB].GetPositionX(), Locs[LOC_ANUB].GetPositionY(), Locs[LOC_ANUB].GetPositionZ(), Locs[LOC_ANUB].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 630000000); + } + + // move corpses + const uint64 npcs[4] = { NPC_IcehowlGUID, NPC_JaraxxusGUID, NPC_LightbaneGUID, NPC_DarkbaneGUID }; + for (const uint64 i : npcs) + { + if (Creature* c = instance->GetCreature(i)) + { + if (c->GetGUID() == NPC_IcehowlGUID) + c->UpdatePosition(626.57f, 162.8f, 140.25f, 4.44f, true); + else if (c->GetGUID() == NPC_JaraxxusGUID) + c->UpdatePosition(603.92f, 102.61f, 141.85f, 1.4f, true); + else if (c->GetGUID() == NPC_LightbaneGUID) + c->UpdatePosition(634.58f, 147.16f, 140.5f, 3.02f, true); + else if (c->GetGUID() == NPC_DarkbaneGUID) + c->UpdatePosition(630.88f, 131.39f, 140.8f, 3.02f, true); + + c->StopMovingOnCurrentPos(); + c->DestroyForNearbyPlayers(); + } + } + } + } + bool IsValidDedicatedInsanityItem(const ItemTemplate* item) { if (!item) // should not happen, but checked in GetAverageItemLevel() @@ -230,6 +264,8 @@ public: break; case GO_ARGENT_COLISEUM_FLOOR: GO_FloorGUID = go->GetGUID(); + if (InstanceProgress == INSTANCE_PROGRESS_ANUB_ARAK) + go->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); break; case GO_SOUTH_PORTCULLIS: case GO_NORTH_PORTCULLIS: @@ -1301,37 +1337,8 @@ public: if( Creature* t = c->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f, true) ) t->DespawnOrUnsummon(); - if( Creature* barrett = instance->GetCreature(NPC_BarrettGUID) ) - { - barrett->SetVisible(false); - barrett->SummonCreature(NPC_ANUBARAK, Locs[LOC_ANUB].GetPositionX(), Locs[LOC_ANUB].GetPositionY(), Locs[LOC_ANUB].GetPositionZ(), Locs[LOC_ANUB].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 630000000); - } - - // move corpses: - if( Creature* c = instance->GetCreature(NPC_IcehowlGUID) ) - { - c->UpdatePosition(626.57f, 162.8f, 140.25f, 4.44f, true); - c->StopMovingOnCurrentPos(); - c->DestroyForNearbyPlayers(); - } - if( Creature* c = instance->GetCreature(NPC_JaraxxusGUID) ) - { - c->UpdatePosition(603.92f, 102.61f, 141.85f, 1.4f, true); - c->StopMovingOnCurrentPos(); - c->DestroyForNearbyPlayers(); - } - if( Creature* c = instance->GetCreature(NPC_LightbaneGUID) ) - { - c->UpdatePosition(634.58f, 147.16f, 140.5f, 3.02f, true); - c->StopMovingOnCurrentPos(); - c->DestroyForNearbyPlayers(); - } - if( Creature* c = instance->GetCreature(NPC_DarkbaneGUID) ) - { - c->UpdatePosition(630.88f, 131.39f, 140.8f, 3.02f, true); - c->StopMovingOnCurrentPos(); - c->DestroyForNearbyPlayers(); - } + InstanceProgress = INSTANCE_PROGRESS_ANUB_ARAK; + SpawnAnubArak(); } events.PopEvent(); events.RescheduleEvent(EVENT_SCENE_410, 2000); @@ -1427,6 +1434,9 @@ public: if( DoNeedCleanup(true) ) InstanceCleanup(); + // if missing spawn anub'arak + SpawnAnubArak(); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL); } @@ -1533,14 +1543,23 @@ public: NPC_LightbaneGUID = 0; break; case INSTANCE_PROGRESS_VALKYR_DEAD: - if( GameObject* floor = instance->GetGameObject(GO_FloorGUID) ) - floor->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, NULL, true); - if( Creature* c = instance->GetCreature(NPC_BarrettGUID) ) + case INSTANCE_PROGRESS_ANUB_ARAK: + /*if( GameObject* floor = instance->GetGameObject(GO_FloorGUID) ) + floor->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, NULL, true);*/ + if (Creature* c = instance->GetCreature(NPC_BarrettGUID)) { - c->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - c->SetVisible(true); - c->SetFacingTo(c->GetOrientation()); - if( Creature* t = c->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f, true) ) + if (InstanceProgress == INSTANCE_PROGRESS_ANUB_ARAK) + { + c->SetVisible(false); + c->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + } + else + { + c->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + c->SetVisible(true); + c->SetFacingTo(c->GetOrientation()); + } + if (Creature* t = c->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f, true)) t->DespawnOrUnsummon(); } if( Creature* c = instance->GetCreature(NPC_LichKingGUID) ) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index 1310d0237..2f69de307 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -39,6 +39,7 @@ enum Progress INSTANCE_PROGRESS_JARAXXUS_DEAD, INSTANCE_PROGRESS_FACTION_CHAMPIONS_DEAD = 6, INSTANCE_PROGRESS_VALKYR_DEAD = 8, + INSTANCE_PROGRESS_ANUB_ARAK, INSTANCE_PROGRESS_DONE = 10, };