From ca8c6038ba1db67ff8c5b890ec966e38ce4ffbf2 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Thu, 23 Aug 2018 00:09:12 +0200 Subject: [PATCH] Scripts/BoT: updated respawn mechanics for Halfus Wyrmbreaker and Ascendant Council to work with the dynamic spawn system --- .../custom/custom_2018_08_23_05_world.sql | 10 +++ .../BastionOfTwilight/bastion_of_twilight.h | 25 ++---- .../boss_ascendant_council.cpp | 18 +++- .../boss_halfus_wyrmbreaker.cpp | 83 ++++++++++++++++++- .../instance_bastion_of_twilight.cpp | 36 +------- 5 files changed, 118 insertions(+), 54 deletions(-) create mode 100644 sql/updates/world/custom/custom_2018_08_23_05_world.sql diff --git a/sql/updates/world/custom/custom_2018_08_23_05_world.sql b/sql/updates/world/custom/custom_2018_08_23_05_world.sql new file mode 100644 index 00000000000..9d256b1fd82 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_08_23_05_world.sql @@ -0,0 +1,10 @@ +DELETE FROM `creature` WHERE `guid` IN (253891 , 253890, 253889, 253888, 253887, 253886, 253885, 253884, 253883, 253882, 253858, 253855, 253853, 253852, 253870, 253879, 253875, 253859, 253857, 253856, 253854, 253851, 253850, 253877, 253880, 253862, 253860, 254144, 254133, 254134, 254148); + +DELETE FROM `creature_addon` WHERE `guid` IN (253891 , 253890, 253889, 253888, 253887, 253886, 253885, 253884, 253883, 253882, 253858, 253855, 253853, 253852, 253870, 253879, 253875, 253859, 253857, 253856, 253854, 253851, 253850, 253877, 253880, 253862, 253860, 254144, 254133, 254134, 254148); + +DELETE FROM `gameobject` WHERE `guid` IN (211098, 211085); +DELETE FROM `gameobject_addon` WHERE `guid` IN (211098, 211085); + +DELETE FROM `instance_spawn_groups` WHERE `InstanceMapId`= 671; +DELETE FROM `spawn_group` WHERE `groupId` IN (52, 53); +DELETE FROM `spawn_group_template` WHERE `groupId` IN (52, 53); diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h index b8d58d588c4..d3dcf37bd87 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h @@ -46,22 +46,22 @@ enum BoTDataTypes DATA_CORRUPTION = 14, // GameObject Types - DATA_WHELP_CAGE = 15, - DATA_GRIM_BATOL_RAID_TRAP_DOOR = 16, + DATA_GRIM_BATOL_RAID_TRAP_DOOR = 15, // Areatriggers - DATA_AT_HALFUS_INTRO = 17, - DATA_AT_THERALION_AND_VALIONA_INTRO = 18, - DATA_AT_ASCENDANT_COUNCIL_INTRO_1 = 19, - DATA_AT_ASCENDANT_COUNCIL_INTRO_2 = 20, - DATA_AT_ASCENDANT_COUNCIL_INTRO_3 = 21, - DATA_AT_CHOGALL_INTRO = 22, + DATA_AT_HALFUS_INTRO = 16, + DATA_AT_THERALION_AND_VALIONA_INTRO = 17, + DATA_AT_ASCENDANT_COUNCIL_INTRO_1 = 18, + DATA_AT_ASCENDANT_COUNCIL_INTRO_2 = 19, + DATA_AT_ASCENDANT_COUNCIL_INTRO_3 = 20, + DATA_AT_CHOGALL_INTRO = 21, // Encounter Related /*Halfus Wyrmbreaker*/ DATA_UNRESPONSIVE_DRAGON_FIRST, DATA_UNRESPONSIVE_DRAGON_SECOND, DATA_CAST_DRAGON_BUFFS, + DATA_DRAGON_CAGE_ENABLED, DATA_OPEN_ORPHANED_EMERALD_WHELP_CAGE, /*Theralion and Valiona*/ @@ -69,9 +69,6 @@ enum BoTDataTypes DATA_COLLAPSING_TWILIGHT_PORTAL_COUNT, DATA_VALIONA_AURA_DUMMY, - /*Ascendant Council*/ - DATA_RESPAWN_ASCENDANT_COUNCIL, - /*Cho'Gall*/ DATA_FULL_HEROIC_ID }; @@ -159,6 +156,7 @@ enum BoTGameObjects GO_ASCENDANT_COUNCIL_EXIT = 205227, GO_CHOGALL_ENTRANCE = 205228, GO_WHELP_CAGE = 205087, + GO_WHELP_CAGE_BASE = 205088, GO_GRIM_BATOL_RAID_TRAP_DOOR = 205898 }; @@ -199,11 +197,6 @@ enum BoTSpells SPELL_DANCING_FLAMES_VISUAL = 83962 }; -enum BoTSpawnGroups -{ - SPAWN_GROUP_ASCENDANT_COUNCIL = 53 -}; - template AI* GetBastionOfTwilightAI(Creature* creature) { diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp index 8229e549afa..b8bafb87544 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp @@ -291,6 +291,11 @@ enum SummonProperties PROPERTY_DEFAULT = 64 }; +Position const feludiusSpawnPos = { -1053.37f, -564.056f, 835.242f, 5.70723f }; +Position const ignaciousSpawnPos = { -1051.52f, -600.976f, 835.284f, 0.0349066f }; +Position const arionSpawnPos = { -1060.87f, -634.283f, 877.773f, 0.855211f }; +Position const terrastraSpawnPos = { -1059.68f, -531.37f, 877.773f, 5.68977f }; + Position const arionMiddlePosition = { -1007.961f, -582.0203f, 831.9003f }; Position const terrastraMiddlePosition = { -1009.37f, -583.4302f, 831.901f }; Position const feludiusMiddlePosition = { -1007.965f, -583.4254f, 831.901f }; @@ -307,9 +312,11 @@ class boss_ascendant_council_controller : public CreatureScript void Reset() override { - _Reset(); - instance->SetData(DATA_RESPAWN_ASCENDANT_COUNCIL, IN_PROGRESS); - events.SetPhase(PHASE_FELUDIUS_IGNACIOUS); + if (instance->GetBossState(DATA_ASCENDANT_COUNCIL) != DONE) + { + events.ScheduleEvent(EVENT_RESET_BOSS_STATE, Milliseconds(1)); + events.SetPhase(PHASE_FELUDIUS_IGNACIOUS); + } } void DoAction(int32 action) override @@ -446,7 +453,10 @@ class boss_ascendant_council_controller : public CreatureScript { case EVENT_RESET_BOSS_STATE: instance->SetBossState(DATA_ASCENDANT_COUNCIL, NOT_STARTED); - instance->SetData(DATA_RESPAWN_ASCENDANT_COUNCIL, IN_PROGRESS); + DoSummon(BOSS_FELUDIUS, feludiusSpawnPos); + DoSummon(BOSS_IGNACIOUS, ignaciousSpawnPos); + DoSummon(BOSS_ARION, arionSpawnPos); + DoSummon(BOSS_TERRASTRA, terrastraSpawnPos); break; case EVENT_SUMMON_ELEMENTIUM_MONSTROSITY: if (Creature* feludius = instance->GetCreature(DATA_FELUDIUS)) diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp index 7a94d7cbddd..fb152d88e1d 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp @@ -91,6 +91,48 @@ enum Texts SAY_ANNOUNCE_FURIOUS_ROAR = 3 }; +Position const SpikePositions[] = +{ + { -348.538f, -700.247f, 888.19f, 5.53269f }, + { -353.764f, -706.361f, 888.19f, 2.30383f }, + { -352.804f, -695.064f, 888.19f, 5.35816f }, + { -358.964f, -702.148f, 888.19f, 2.30383f }, + { -320.158f, -727.995f, 888.191f, 3.24631f }, + { -274.891f, -656.835f, 888.189f, 4.95674f }, + { -284.868f, -661.151f, 888.19f, 1.71042f }, + { -277.955f, -687.788f, 888.192f, 3.15905f }, + { -314.986f, -717.396f, 888.19f, 0.261799f }, + { -280.724f, -674.46f, 888.19f, 0.0872665f }, + { -273.922f, -675.948f, 888.189f, 6.19592f }, + { -283.142f, -685.325f, 888.191f, 3.15905f }, + { -321.974f, -718.424f, 888.191f, 0.383972f }, + { -273.01f, -684.694f, 888.191f, 3.15905f } +}; + +Position const OrphanedEmeraldWhelpPositions[] = +{ + { -342.002f, -726.528f, 891.764f, 1.16937f }, + { -340.75f, -722.476f, 891.764f, 1.16937f }, + { -350.564f, -721.663f, 891.763f, 1.01229f }, + { -347.08f, -728.128f, 891.764f, 1.11701f }, + { -346.434f, -724.049f, 891.764f, 1.09956f }, + { -347.578f, -717.302f, 891.763f, 1.0472f }, + { -350.571f, -725.417f, 891.763f, 1.06465f }, + { -344.839f, -720.163f, 891.764f, 1.0821f } +}; + +Position const NetherScionPos = { -280.118f, -659.385f, 888.188f, 1.67552f }; +Position const SlateDragonPos = { -279.111f, -680.594f, 888.191f, 3.10669f }; +Position const StormRiderPos = { -318.705f, -722.688f, 888.191f, 3.19395f }; +Position const TimeWardenPos = { -353.179f, -700.667f, 888.19f, 5.53269f }; +Position const ProtoBehemothPos = { -265.891f, -740.023f, 907.363f, 2.33874f }; + +Position const WhelpCageBasePos = { -346.672f, -723.26f, 888.106f, 5.53269f }; +QuaternionData const WhelpCageBaseRot = QuaternionData(0.0f, 0.0f, -0.366501f, 0.930418f); + +Position const WhelpCagePos = { -346.672f, -723.26f, 888.106f, 5.53269f }; +QuaternionData const WhelpCageRot = QuaternionData(0.0f, 0.0f, -0.366501f, 0.930418f); + class boss_halfus_wyrmbreaker : public CreatureScript { public: @@ -116,6 +158,25 @@ class boss_halfus_wyrmbreaker : public CreatureScript _Reset(); Initialize(); instance->SetData(DATA_CAST_DRAGON_BUFFS, DRAGON_BUFFS_HALFUS_WYRMBREAKER); + + if (GameObject* cageBase = me->SummonGameObject(GO_WHELP_CAGE_BASE, WhelpCageBasePos, WhelpCageBaseRot, WEEK, GO_SUMMON_TIMED_DESPAWN)) + _cageBaseGUID = cageBase->GetGUID(); + + if (GameObject* cage = me->SummonGameObject(GO_WHELP_CAGE, WhelpCagePos, WhelpCageRot, WEEK, GO_SUMMON_TIMED_DESPAWN)) + _cageGUID = cage->GetGUID(); + + DoSummon(NPC_NETHER_SCION, NetherScionPos); + DoSummon(NPC_SLATE_DRAGON, SlateDragonPos); + DoSummon(NPC_STORM_RIDER, StormRiderPos); + DoSummon(NPC_TIME_WARDEN, TimeWardenPos); + + for (uint8 i = 0; i < 8; i++) + DoSummon(NPC_ORPHANED_EMERALD_WELP, OrphanedEmeraldWhelpPositions[i]); + + for (uint8 i = 0; i < 14; i++) + DoSummon(NPC_SPIKE, SpikePositions[i]); + + DoSummon(NPC_PROTO_BEHEMOTH, ProtoBehemothPos); } void JustEngagedWith(Unit* /*who*/) override @@ -125,7 +186,11 @@ class boss_halfus_wyrmbreaker : public CreatureScript instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); if (Creature* protoBehemoth = instance->GetCreature(DATA_PROTO_BEHEMOTH)) - protoBehemoth->SetInCombatWithZone(); + protoBehemoth->AI()->DoZoneInCombat(); + + if (instance->GetData(DATA_DRAGON_CAGE_ENABLED)) + if (GameObject* cage = ObjectAccessor::GetGameObject(*me, _cageGUID)) + cage->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); if (me->HasAura(SPELL_SHADOW_WRAPPED)) events.ScheduleEvent(EVENT_SHADOW_NOVA, Seconds(7)); @@ -141,12 +206,26 @@ class boss_halfus_wyrmbreaker : public CreatureScript { _JustDied(); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + if (GameObject* cage = ObjectAccessor::GetGameObject(*me, _cageGUID)) + cage->DespawnOrUnsummon(); + + if (GameObject* cageBase = ObjectAccessor::GetGameObject(*me, _cageBaseGUID)) + cageBase->DespawnOrUnsummon(); } void EnterEvadeMode(EvadeReason /*why*/) override { _EnterEvadeMode(); + summons.DespawnAll(); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + if (GameObject* cage = ObjectAccessor::GetGameObject(*me, _cageGUID)) + cage->DespawnOrUnsummon(); + + if (GameObject* cageBase = ObjectAccessor::GetGameObject(*me, _cageBaseGUID)) + cageBase->DespawnOrUnsummon(); + _DespawnAtEvade(); } @@ -265,6 +344,8 @@ class boss_halfus_wyrmbreaker : public CreatureScript } private: + ObjectGuid _cageGUID; + ObjectGuid _cageBaseGUID; bool _announcedOrphanedEmeraldWhelpBinding; bool _furiousRoarEnabled; uint8 _theOnlyEscapeAchievementState; diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp index d25cad94c25..30c3e8aa94c 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp @@ -46,7 +46,6 @@ ObjectData const creatureData[] = ObjectData const gameobjectData[] = { - { GO_WHELP_CAGE, DATA_WHELP_CAGE }, { GO_GRIM_BATOL_RAID_TRAP_DOOR, DATA_GRIM_BATOL_RAID_TRAP_DOOR }, { 0, 0 } // END }; @@ -192,10 +191,6 @@ class instance_bastion_of_twilight : public InstanceMapScript case DATA_HALFUS_WYRMBREAKER: if (state == IN_PROGRESS) { - if (instance->IsHeroic() || HasActiveOrphanedEmeraldWhelps()) - if (GameObject* cage = GetGameObject(DATA_WHELP_CAGE)) - cage->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - for (ObjectGuid guid : _halfusEncounterGUIDs) { if (Creature* creature = instance->GetCreature(guid)) @@ -232,34 +227,12 @@ class instance_bastion_of_twilight : public InstanceMapScript } else if (state == FAIL) { - if (Creature* protoBehemoth = GetCreature(DATA_PROTO_BEHEMOTH)) - protoBehemoth->DespawnOrUnsummon(Milliseconds(0), Seconds(30)); - - for (ObjectGuid guid : _halfusEncounterGUIDs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(Milliseconds(0), Seconds(30)); - - if (GameObject* cage = GetGameObject(DATA_WHELP_CAGE)) - cage->DespawnOrUnsummon(Milliseconds(0), Seconds(30)); - _halfusEncounterGUIDs.clear(); _deadOrphanedEmeraldWhelps = 0; events.CancelEvent(EVENT_CAST_DANCING_FLAMES); } else if (state == DONE) - { - if (Creature* protoBehemoth = GetCreature(DATA_PROTO_BEHEMOTH)) - protoBehemoth->DespawnOrUnsummon(Milliseconds(0)); - - for (ObjectGuid guid : _halfusEncounterGUIDs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(Milliseconds(0)); - - if (GameObject* cage = GetGameObject(DATA_WHELP_CAGE)) - cage->DespawnOrUnsummon(Milliseconds(0)); - events.CancelEvent(EVENT_CAST_DANCING_FLAMES); - } break; case DATA_THERALION_AND_VALIONA: if (state == FAIL) @@ -413,11 +386,6 @@ class instance_bastion_of_twilight : public InstanceMapScript SaveToDB(); } break; - case DATA_RESPAWN_ASCENDANT_COUNCIL: - if (!GetCreature(DATA_FELUDIUS)) - if (instance->IsSpawnGroupActive(SPAWN_GROUP_ASCENDANT_COUNCIL)) - instance->SpawnGroupSpawn(SPAWN_GROUP_ASCENDANT_COUNCIL, true, true); - break; default: break; } @@ -446,6 +414,8 @@ class instance_bastion_of_twilight : public InstanceMapScript return _unresponsiveDragonEntryFirst; case DATA_UNRESPONSIVE_DRAGON_SECOND: return _unresponsiveDragonEntrySecond; + case DATA_DRAGON_CAGE_ENABLED: + return uint8((instance->IsHeroic() || HasActiveOrphanedEmeraldWhelps())); case DATA_COLLAPSING_TWILIGHT_PORTAL_COUNT: { uint8 portalCount = 0; @@ -520,7 +490,7 @@ class instance_bastion_of_twilight : public InstanceMapScript && _unresponsiveDragonEntrySecond != NPC_ORPHANED_EMERALD_WELP); } - protected: + private: EventMap events; GuidSet _halfusEncounterGUIDs; GuidSet _dancingFlamesInvisibleStalkerGUIDs;