Scripts/SFK: reworked spawn group handling for boss related spawns and corrected some spawn group spawn id assignments for Horde spawn groups

This commit is contained in:
Ovahlord
2020-01-09 17:32:57 +01:00
parent ea4352d408
commit 741dba7cdf
2 changed files with 126 additions and 101 deletions

View File

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

View File

@@ -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<uint32 /*bossStateId*/, SpawnGroupInfo> 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<uint32>_teamInInstance;
uint32 _currentlyActiveTroupSpawnGroup;
ObjectGuid _cromushGUID;
};