diff options
Diffstat (limited to 'src/server/game/Maps')
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 1 | ||||
| -rw-r--r-- | src/server/game/Maps/SpawnData.h | 18 |
3 files changed, 34 insertions, 8 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 174b3fda99a..e9fe8caffc3 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -853,6 +853,7 @@ void Map::Update(uint32 t_diff) if (_respawnCheckTimer <= t_diff) { ProcessRespawns(); + UpdateSpawnGroupConditions(); _respawnCheckTimer = sWorld->getIntConfig(CONFIG_RESPAWN_MINCHECKINTERVALMS); } else @@ -3640,6 +3641,28 @@ bool Map::IsSpawnGroupActive(uint32 groupId) const return (_toggledSpawnGroupIds.find(groupId) != _toggledSpawnGroupIds.end()) != !(data->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN); } +void Map::UpdateSpawnGroupConditions() +{ + std::vector<uint32> const* spawnGroups = sObjectMgr->GetSpawnGroupsForMap(GetId()); + if (!spawnGroups) + return; + + for (uint32 spawnGroupId : *spawnGroups) + { + bool isActive = IsSpawnGroupActive(spawnGroupId); + bool shouldBeActive = sConditionMgr->IsMapMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_SPAWN_GROUP, spawnGroupId, this); + if (isActive == shouldBeActive) + continue; + + if (shouldBeActive) + SpawnGroupSpawn(spawnGroupId); + else if (ASSERT_NOTNULL(GetSpawnGroupData(spawnGroupId))->flags & SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE) + SpawnGroupDespawn(spawnGroupId); + else + SetSpawnGroupInactive(spawnGroupId); + } +} + void Map::AddFarSpellCallback(FarSpellCallback&& callback) { _farSpellCallbacks.Enqueue(new FarSpellCallback(std::move(callback))); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index d4b7b5c1c10..f589ce9e0e3 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -876,6 +876,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType> } void SetSpawnGroupActive(uint32 groupId, bool state); + void UpdateSpawnGroupConditions(); std::unordered_set<uint32> _toggledSpawnGroupIds; uint32 _respawnCheckTimer; diff --git a/src/server/game/Maps/SpawnData.h b/src/server/game/Maps/SpawnData.h index c672ec528ad..9f25655e46e 100644 --- a/src/server/game/Maps/SpawnData.h +++ b/src/server/game/Maps/SpawnData.h @@ -50,14 +50,16 @@ enum SpawnObjectTypeMask enum SpawnGroupFlags { - SPAWNGROUP_FLAG_NONE = 0x00, - SPAWNGROUP_FLAG_SYSTEM = 0x01, - SPAWNGROUP_FLAG_COMPATIBILITY_MODE = 0x02, - SPAWNGROUP_FLAG_MANUAL_SPAWN = 0x04, - SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE = 0x08, - SPAWNGROUP_FLAG_ESCORTQUESTNPC = 0x10, - - SPAWNGROUP_FLAGS_ALL = (SPAWNGROUP_FLAG_SYSTEM | SPAWNGROUP_FLAG_COMPATIBILITY_MODE | SPAWNGROUP_FLAG_MANUAL_SPAWN | SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE | SPAWNGROUP_FLAG_ESCORTQUESTNPC) + SPAWNGROUP_FLAG_NONE = 0x00, + SPAWNGROUP_FLAG_SYSTEM = 0x01, + SPAWNGROUP_FLAG_COMPATIBILITY_MODE = 0x02, + SPAWNGROUP_FLAG_MANUAL_SPAWN = 0x04, + SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE = 0x08, + SPAWNGROUP_FLAG_ESCORTQUESTNPC = 0x10, + SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE = 0x20, + + SPAWNGROUP_FLAGS_ALL = (SPAWNGROUP_FLAG_SYSTEM | SPAWNGROUP_FLAG_COMPATIBILITY_MODE | SPAWNGROUP_FLAG_MANUAL_SPAWN + | SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE | SPAWNGROUP_FLAG_ESCORTQUESTNPC | SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE) }; struct SpawnGroupTemplateData |
