From 5d27939667cf3ca985a33b93646fa4e34445c8d3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 24 Jun 2022 22:20:34 +0200 Subject: Core/Conditions: Implemented conditions for spawn groups --- src/server/game/Maps/Map.cpp | 23 +++++++++++++++++++++++ src/server/game/Maps/Map.h | 1 + src/server/game/Maps/SpawnData.h | 18 ++++++++++-------- 3 files changed, 34 insertions(+), 8 deletions(-) (limited to 'src/server/game/Maps') 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 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 } void SetSpawnGroupActive(uint32 groupId, bool state); + void UpdateSpawnGroupConditions(); std::unordered_set _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 -- cgit v1.2.3