Scripts/BoT: updated respawn mechanics for Halfus Wyrmbreaker and Ascendant Council to work with the dynamic spawn system

This commit is contained in:
Ovahlord
2018-08-23 00:09:12 +02:00
parent d032cc15a5
commit ca8c6038ba
5 changed files with 118 additions and 54 deletions

View 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);

View File

@@ -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)
{

View File

@@ -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))

View File

@@ -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;

View File

@@ -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;