From 741dba7cdf91efc344af4af25fd9794a4990d8f8 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Thu, 9 Jan 2020 17:32:57 +0100 Subject: [PATCH] Scripts/SFK: reworked spawn group handling for boss related spawns and corrected some spawn group spawn id assignments for Horde spawn groups --- .../custom/custom_2020_01_09_01_world.sql | 18 ++ .../instance_shadowfang_keep.cpp | 209 +++++++++--------- 2 files changed, 126 insertions(+), 101 deletions(-) create mode 100644 sql/updates/world/custom/custom_2020_01_09_01_world.sql diff --git a/sql/updates/world/custom/custom_2020_01_09_01_world.sql b/sql/updates/world/custom/custom_2020_01_09_01_world.sql new file mode 100644 index 00000000000..da99cc4ccff --- /dev/null +++ b/sql/updates/world/custom/custom_2020_01_09_01_world.sql @@ -0,0 +1,18 @@ +UPDATE `spawn_group_template` SET `groupName`= 'Shadownfang Keep - Commander Springvale Horde Troups' WHERE `groupId`= 428; +DELETE FROM `spawn_group_template` WHERE `groupId` IN (429, 430); +INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES +(429, 'Shadowfang Keep - Commander Springvale - Deathstalker Commander Belmont', 4), +(430, 'Shadowfang Keep - Lord Walden - Deathstalker Commander Belmont', 4); + +UPDATE `spawn_group` SET `groupId`= 430 WHERE `spawnType`= 0 AND `spawnId`= 395384; + +SET @CGUID := 395385; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+1; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 47294, 33, 209, 0, 3, 169, 0, 0, 0, -137.918, 2169.69, 136.6613, 2.775074, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 15595), -- High Warlord Cromush (Area: 0 - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+1, 47293, 33, 209, 0, 3, 169, 0, 0, 0, -264.7126, 2269.896, 97.17555, 5.929502, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 15595); -- Deathstalker Commander Belmont (Area: 0 - Difficulty: 0) (possible waypoints or random movement) + +DELETE FROM `spawn_group` WHERE `spawnType`= 0 AND `spawnId` BETWEEN @CGUID+0 AND @CGUID+1; +INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES +(428, 0, @CGUID+0), +(429, 0, @CGUID+1); diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp index 9187f83d4c2..224e4301a36 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp @@ -45,7 +45,6 @@ ObjectData const gameobjectData[] = DoorData const doorData[] = { { GO_ARUGAL_DOOR, DATA_LORD_GODFREY, DOOR_TYPE_ROOM }, - { GO_SORCERERS_DOOR, DATA_LORD_WALDEN, DOOR_TYPE_PASSAGE }, // Tempfix until events have been implemented { 0, 0, DOOR_TYPE_ROOM } // END }; @@ -57,23 +56,46 @@ BossBoundaryData const boundaries = enum SpawnGroups { - SPAWN_GROUP_ENTRANCE_ALLIANCE = 412, - SPAWN_GROUP_ENTRANCE_HORDE = 413, - SPAWN_GROUP_DISEASE_CLOUDS_ENTRANCE = 414, - SPAWN_GROUP_DISEASE_CLOUDS_BARON_ASHBURY = 415, - SPAWN_GROUP_DISEASE_CLOUDS_BARON_SILVERLAINE = 416, - SPAWN_GROUP_DISEASE_CLOUDS_COMMANDER_SPRINGVALE = 417, - SPAWN_GROUP_DISEASE_CLOUDS_LORD_WALDEN = 418, - SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_ALLIANCE = 419, - SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_HORDE = 420, - SPAWN_GROUP_BARON_ASHBURY_TROUPS_ALLIANCE = 421, - SPAWN_GROUP_BARON_ASHBURY_TROUPS_HORDE = 422, - SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_ALLIANCE = 423, - SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_HORDE = 424, - SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE = 425, - SPAWN_GROUP_OUTSIDE_TROUPS_ALLIANCE = 426, - SPAWN_GROUP_LORD_WALDEN_TROUPS_ALLIANCE = 427, - SPAWN_GROUP_LORD_WALDEN_TROUPS_HORDE = 428 + SPAWN_GROUP_ENTRANCE_ALLIANCE = 412, // Spawned by default when Baron Ashbury is not defeated for Alliance players + SPAWN_GROUP_ENTRANCE_HORDE = 413, // Spawned by default when Baron Ashbury is not defeated for Horde players + + SPAWN_GROUP_DISEASE_CLOUDS_ENTRANCE = 414, // Spawned by default for Horde players + SPAWN_GROUP_DISEASE_CLOUDS_BARON_ASHBURY = 415, // Spawned for Horde players when Baron Ashbury has been defeated + SPAWN_GROUP_DISEASE_CLOUDS_BARON_SILVERLAINE = 416, // Spawned for Horde players when Baron Silverlaine has been defeated + SPAWN_GROUP_DISEASE_CLOUDS_COMMANDER_SPRINGVALE = 417, // Spawned for Horde players when Commander Springvale has been defeated + SPAWN_GROUP_DISEASE_CLOUDS_LORD_WALDEN = 418, // Spawned for Horde players when Lord Walden has been defeated + + SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_ALLIANCE = 419, // Spawned for Alliance players when Lord Walden has been defeated + SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_HORDE = 420, // Spawned for Horde players when Lord Walden has been defeated + + SPAWN_GROUP_BARON_ASHBURY_TROUPS_ALLIANCE = 421, // Spawned for Alliance players when Baron Ashbury has been defeated + SPAWN_GROUP_BARON_ASHBURY_TROUPS_HORDE = 422, // Spawned for Horde players when Baron Ashbury has been defeated + + SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_ALLIANCE = 423, // Spawned for Alliance players when Baron Silverlaine has been defeated + SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_HORDE = 424, // Spawned for Horde players when Baron Silverlaine has been defeated + + SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE = 425, // Spawned for Alliance players when Commander Springvale has been defeated + SPAWN_GROUP_OUTSIDE_TROUPS_ALLIANCE = 426, // Spawned for Alliance players when triggering an areatrigger after defeating Commander Springvale + SPAWN_GROUP_LORD_WALDEN_TROUPS_ALLIANCE = 427, // Spawned for Alliance players when Lord Walden has been defeated + + SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_HORDE = 428, // Spawned for Horde players when Commander Springvale or Lord Walden has been defeated + SPAWN_GROUP_COMMANDER_SPRINGVALE_BELMONT = 429, // Spawned for Horde players when Commander Springvale has been defeated + SPAWN_GROUP_LORD_WALDEN_BELMONT = 430 // Spawned for Horde players when Lord Walden has been defeated +}; + +struct SpawnGroupInfo +{ + uint32 AllianceSpawnGroup = 0; + uint32 HordeSpawnGroup = 0; + uint32 DiseaseCloudsSpawnGroup = 0; +}; + +std::unordered_map SpawnGroupsByBossStateId = +{ + { DATA_BARON_ASHBURY, { SPAWN_GROUP_BARON_ASHBURY_TROUPS_ALLIANCE, SPAWN_GROUP_BARON_ASHBURY_TROUPS_HORDE, SPAWN_GROUP_DISEASE_CLOUDS_BARON_ASHBURY }}, + { DATA_BARON_SILVERLAINE, { SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_ALLIANCE, SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_HORDE, SPAWN_GROUP_DISEASE_CLOUDS_BARON_SILVERLAINE }}, + { DATA_COMMANDER_SPRINGVALE, { SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE, SPAWN_GROUP_COMMANDER_SPRINGVALE_BELMONT, SPAWN_GROUP_DISEASE_CLOUDS_COMMANDER_SPRINGVALE }}, + { DATA_LORD_WALDEN, { SPAWN_GROUP_LORD_WALDEN_TROUPS_ALLIANCE, SPAWN_GROUP_LORD_WALDEN_BELMONT, SPAWN_GROUP_DISEASE_CLOUDS_LORD_WALDEN }}, }; class instance_shadowfang_keep : public InstanceMapScript @@ -90,7 +112,6 @@ public: LoadDoorData(doorData); LoadBossBoundaries(boundaries); LoadObjectData(creatureData, gameobjectData); - _currentlyActiveTroupSpawnGroup = 0; } void OnPlayerEnter(Player* player) override @@ -98,7 +119,27 @@ public: if (!_teamInInstance.is_initialized()) { _teamInInstance = player->GetTeam(); - UpdateSpawnGroups(); + + // Setting up entrance spawns when Baron Ashbury has not been defeated yet + if (GetBossState(DATA_BARON_ASHBURY) != DONE) + instance->SpawnGroupSpawn(*_teamInInstance == ALLIANCE ? SPAWN_GROUP_ENTRANCE_ALLIANCE : SPAWN_GROUP_ENTRANCE_HORDE); + + // Setting up disease clouds based on instance progress + if (*_teamInInstance == HORDE) + { + for (uint32 bossId : { DATA_BARON_ASHBURY, DATA_BARON_SILVERLAINE, DATA_COMMANDER_SPRINGVALE, DATA_LORD_WALDEN }) + { + if (GetBossState(bossId) == DONE) + { + SpawnGroupInfo spawnGroupInfo = SpawnGroupsByBossStateId[bossId]; + instance->SpawnGroupSpawn(spawnGroupInfo.DiseaseCloudsSpawnGroup); + } + } + } + + // Setting up dead troup spawns when Lord Walden has been defeated already + if (GetBossState(DATA_LORD_WALDEN) == DONE) + instance->SpawnGroupSpawn(*_teamInInstance == ALLIANCE ? SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_ALLIANCE : SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_HORDE); } } @@ -145,99 +186,43 @@ public: if (!InstanceScript::SetBossState(type, state)) return false; - if (state == DONE) + if (state != DONE || type == BOSS_LORD_GODFREY) + return true; + + SpawnGroupInfo spawnGroupInfo = SpawnGroupsByBossStateId[type]; + + // Clean up previous spawned groups + DespawnPreviousTroups(); + + // Spawn group linked to boss encounter + instance->SpawnGroupSpawn(*_teamInInstance == ALLIANCE ? spawnGroupInfo.AllianceSpawnGroup : spawnGroupInfo.HordeSpawnGroup); + + // Spawn disease clouds linked to boss encounter + if (*_teamInInstance == HORDE) + instance->SpawnGroupSpawn(spawnGroupInfo.DiseaseCloudsSpawnGroup); + + // Spawn dead troups after defeating Lord Walden + if (type == DATA_LORD_WALDEN) + instance->SpawnGroupSpawn(*_teamInInstance == ALLIANCE ? SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_ALLIANCE : SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_HORDE); + + // Special case for Commander Springvale Horde troups + if (*_teamInInstance == HORDE) { - UpdateSpawnGroups(); - - switch (type) - { - case DATA_BARON_ASHBURY: - _currentlyActiveTroupSpawnGroup = *_teamInInstance == ALLIANCE ? SPAWN_GROUP_BARON_ASHBURY_TROUPS_ALLIANCE : SPAWN_GROUP_BARON_ASHBURY_TROUPS_HORDE; - instance->SpawnGroupSpawn(_currentlyActiveTroupSpawnGroup); - break; - case DATA_BARON_SILVERLAINE: - _currentlyActiveTroupSpawnGroup = *_teamInInstance == ALLIANCE ? SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_ALLIANCE : SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_HORDE; - instance->SpawnGroupSpawn(_currentlyActiveTroupSpawnGroup); - break; - case DATA_COMMANDER_SPRINGVALE: - if (*_teamInInstance == ALLIANCE) - { - _currentlyActiveTroupSpawnGroup = 0; - instance->SpawnGroupSpawn(SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE); - } - break; - case DATA_LORD_WALDEN: - if (*_teamInInstance == ALLIANCE) - { - instance->SpawnGroupDespawn(SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE); - instance->SpawnGroupDespawn(SPAWN_GROUP_OUTSIDE_TROUPS_ALLIANCE); - } - - _currentlyActiveTroupSpawnGroup = *_teamInInstance == ALLIANCE ? SPAWN_GROUP_LORD_WALDEN_TROUPS_ALLIANCE : SPAWN_GROUP_LORD_WALDEN_TROUPS_HORDE; - instance->SpawnGroupSpawn(_currentlyActiveTroupSpawnGroup); - break; - default: - break; - } + if ((type == DATA_LORD_WALDEN && GetBossState(DATA_COMMANDER_SPRINGVALE) != DONE) + || (type == DATA_COMMANDER_SPRINGVALE && GetBossState(DATA_LORD_WALDEN) != DONE)) + instance->SpawnGroupSpawn(SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_HORDE); } return true; } - void UpdateSpawnGroups() - { - // Disease cloud spawns - if (*_teamInInstance == HORDE) - { - instance->SpawnGroupSpawn(SPAWN_GROUP_DISEASE_CLOUDS_ENTRANCE); - - if (GetBossState(DATA_BARON_ASHBURY) == DONE) - instance->SpawnGroupSpawn(SPAWN_GROUP_DISEASE_CLOUDS_BARON_ASHBURY); - - if (GetBossState(DATA_BARON_SILVERLAINE) == DONE) - instance->SpawnGroupSpawn(SPAWN_GROUP_DISEASE_CLOUDS_BARON_SILVERLAINE); - - if (GetBossState(DATA_COMMANDER_SPRINGVALE) == DONE) - instance->SpawnGroupSpawn(SPAWN_GROUP_DISEASE_CLOUDS_COMMANDER_SPRINGVALE); - - if (GetBossState(DATA_LORD_WALDEN) == DONE) - instance->SpawnGroupSpawn(SPAWN_GROUP_DISEASE_CLOUDS_LORD_WALDEN); - } - - // Despawning previous troups - if (_currentlyActiveTroupSpawnGroup) - { - instance->SpawnGroupDespawn(_currentlyActiveTroupSpawnGroup); - - // Despawn the summoned Cromush versions as they are not a part of the spawn groups - if (Creature* cromush = instance->GetCreature(_cromushGUID)) - cromush->DespawnOrUnsummon(); - } - - // Entrance handling - if (GetBossState(DATA_BARON_ASHBURY) != DONE) - { - _currentlyActiveTroupSpawnGroup = *_teamInInstance == ALLIANCE ? SPAWN_GROUP_ENTRANCE_ALLIANCE : SPAWN_GROUP_ENTRANCE_HORDE; - instance->SpawnGroupSpawn(_currentlyActiveTroupSpawnGroup); - } - - // Lord Godfrey room setup - if (GetBossState(DATA_LORD_WALDEN) == DONE) - instance->SpawnGroupSpawn(*_teamInInstance == ALLIANCE ? SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_ALLIANCE : SPAWN_GROUP_LORD_GODFREY_DEAD_TROUPS_HORDE); - } - void SetData(uint32 type, uint32 /*value*/) override { switch (type) { case DATA_OUTSIDE_TROUPS_SPAWN: if (*_teamInInstance == ALLIANCE) - { - if (_currentlyActiveTroupSpawnGroup) - instance->SpawnGroupDespawn(_currentlyActiveTroupSpawnGroup); - instance->SpawnGroupSpawn(SPAWN_GROUP_OUTSIDE_TROUPS_ALLIANCE); - } break; default: break; @@ -256,10 +241,32 @@ public: return 0; } + void DespawnPreviousTroups() + { + if (*_teamInInstance == ALLIANCE) + { + instance->SpawnGroupDespawn(SPAWN_GROUP_ENTRANCE_ALLIANCE); + instance->SpawnGroupDespawn(SPAWN_GROUP_BARON_ASHBURY_TROUPS_ALLIANCE); + instance->SpawnGroupDespawn(SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_ALLIANCE); + instance->SpawnGroupDespawn(SPAWN_GROUP_COMMANDER_SPRINGVALE_TROUPS_ALLIANCE); + instance->SpawnGroupDespawn(SPAWN_GROUP_OUTSIDE_TROUPS_ALLIANCE); + } + else + { + instance->SpawnGroupDespawn(SPAWN_GROUP_ENTRANCE_HORDE); + instance->SpawnGroupDespawn(SPAWN_GROUP_BARON_ASHBURY_TROUPS_HORDE); + instance->SpawnGroupDespawn(SPAWN_GROUP_BARON_SILVERLAINE_TROUPS_HORDE); + instance->SpawnGroupDespawn(SPAWN_GROUP_COMMANDER_SPRINGVALE_BELMONT); + + // Despawn the summoned Cromush version as he is not a part of the spawn groups + if (Creature* cromush = instance->GetCreature(_cromushGUID)) + cromush->DespawnOrUnsummon(); + } + } + protected: EventMap events; Optional_teamInInstance; - uint32 _currentlyActiveTroupSpawnGroup; ObjectGuid _cromushGUID; };