mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
Scripts/BoT: updated respawn mechanics for Halfus Wyrmbreaker and Ascendant Council to work with the dynamic spawn system
This commit is contained in:
10
sql/updates/world/custom/custom_2018_08_23_05_world.sql
Normal file
10
sql/updates/world/custom/custom_2018_08_23_05_world.sql
Normal file
@@ -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);
|
||||
@@ -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<class AI>
|
||||
AI* GetBastionOfTwilightAI(Creature* creature)
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user