mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 02:25:38 +01:00
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:
18
sql/updates/world/custom/custom_2020_01_09_01_world.sql
Normal file
18
sql/updates/world/custom/custom_2020_01_09_01_world.sql
Normal 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);
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user